Inflearn Community Q&A
람다 함수 캡쳐 관련 질문
Written on
·
310
0
안녕하세요 교수님, 람다 함수 캡쳐 관련 질문이 있어서 글을 올렸습니다.
fps 프로젝트를 만들고 있는데, VICharacter 에서 reload 를 호출하면 VIWeaponbase를 상속받는 AKWeapon 에서 Reload 함수가 호출이 되는 형식입니다.
VICharacter 에 bIsReloading 을 선언해 놓았는데, AKWeapon에서 캐릭터 참조를 가져와 재장전이 끝난 후 setter 로 false 설정을할 때 Timerdelegate 람다식에서 Character에 액세스를 하지 못합니다. 제 생각에는 참조의 생명 주기에 문제는 없는 것 같은데,,
왜 람다식 안에서만 캐릭터 참조를 사용 못하는지 모르겠습니다.
아래는 Reload 코드와 프로젝트 깃허브 주소입니다.
void AVIAKWeapon::Reload()
{
Super::Reload();
if (UWorld* World = GetWorld())
{
APlayerController* PC = UGameplayStatics::GetPlayerController(World, 0);
if (PC)
{
AVICharacter* Character = Cast<AVICharacter>(PC->GetCharacter());
if (Character)
{
if (AmmoCount < MaxAmmo)
{
if (!bDoOnceReload && !Character->GetbIsReloading())
{
Character->SetbIsReloading(true);
Character->GetFirstPersonMesh()->GetAnimInstance()->Montage_Play(AKReloadActionMontage, 1.0f);
Mesh->PlayAnimation(ReloadActionAnimation, false);
FTimerHandle ReloadTimeHandle;
GetWorld()->GetTimerManager().SetTimer(ReloadTimeHandle, FTimerDelegate::CreateLambda([&]()
{
Character->SetbIsReloading(false);
AmmoCount = MaxAmmo;
//DF("EndTimer bisRelaoding %d", Character->GetbIsReloading())
// TimerHandle 초기화
GetWorld()->GetTimerManager().ClearTimer(ReloadTimeHandle);
}), ReloadTime, false);
bDoOnceReload = false;
}
}
}
}
}
}https://github.com/chataeg/VI/tree/Part7
unreal-engineue-blueprint언리얼-c++
Answer 3
0
taegwancha
Questioner
AVICharacter* CapturedCharacter = Character;
GetWorld()->GetTimerManager().SetTimer(ReloadTimeHandle, FTimerDelegate::CreateLambda([&, CapturedCharacter]()
{
CapturedCharacter->SetbIsReloading(false);
AmmoCount = MaxAmmo;
//DF("EndTimer bisRelaoding %d", Character->GetbIsReloading())
// TimerHandle 초기화
GetWorld()->GetTimerManager().ClearTimer(ReloadTimeHandle);
}), ReloadTime, false);
안전하게 람다식에서 캡쳐할 때 변수를 같이 캡쳐해주었더니 잘 작동합니다 ! 감사합니다!
0
0
ideugu
Instructor
사실 문의주신 내용과 무관한 주제이긴 한데 게임프레임웍의 Static함수를 사용해 월드 내 주요 액터를 질의하는 방법이 편해보이지만 그리 좋은 구성은 아닙니다. 웨폰이 게임에서 하는 역할과 어느 정도의 권한을 가져야될지 한 번 고민해 보는 게 좋지 않을까 싶습니다.






네 잘 해결되서 다행입니다~