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

차태관님의 프로필 이미지
차태관

작성한 질문수

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

6강 캐릭터 공격 판정

람다 함수 캡쳐 관련 질문

작성

·

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

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

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

0

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

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

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

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

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

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

차태관님의 프로필 이미지
차태관

작성한 질문수

질문하기