작성
·
194
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
답변 3
0
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
네 잘 해결되서 다행입니다~