인프런 커뮤니티 질문&답변

차태관님의 프로필 이미지

작성한 질문수

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해

6강 캐릭터 공격 판정

람다 함수 캡쳐 관련 질문

24.06.21 12:14 작성

·

152

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

차태관님의 프로필 이미지
차태관
질문자

2024. 06. 21. 13:43

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);

 

안전하게 람다식에서 캡쳐할 때 변수를 같이 캡쳐해주었더니 잘 작동합니다 ! 감사합니다!

이득우님의 프로필 이미지
이득우
지식공유자

2024. 06. 21. 15:40

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

0

차태관님의 프로필 이미지
차태관
질문자

2024. 06. 21. 13:30

owner 로 해도 똑같이 오류가 발생하네요..

0

이득우님의 프로필 이미지
이득우
지식공유자

2024. 06. 21. 13:03

음 멀티플레이어 프로젝트인가요 싱글플레이어 프로젝트인가요. 플레이어 소유 무기라면 소유자를 통해서 접근하시는데 좋지않을까 싶네요

차태관님의 프로필 이미지
차태관
질문자

2024. 06. 21. 13:04

싱글 플레이어입니다! 한번 해보겠습니다.

이득우님의 프로필 이미지
이득우
지식공유자

2024. 06. 21. 15:43

사실 문의주신 내용과 무관한 주제이긴 한데 게임프레임웍의 Static함수를 사용해 월드 내 주요 액터를 질의하는 방법이 편해보이지만 그리 좋은 구성은 아닙니다. 웨폰이 게임에서 하는 역할과 어느 정도의 권한을 가져야될지 한 번 고민해 보는 게 좋지 않을까 싶습니다.