inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

6강 캐릭터 공격 판정

람다 함수 캡쳐 관련 질문

326

차태관

작성한 질문수 11

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-engine ue-blueprint 언리얼-c++

답변 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

이득우

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

0

차태관

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

0

이득우

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

0

차태관

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

0

이득우

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

무한맵 제작과정중에 GetWorld 가 Nullptr 을 반환합니다.

0

41

2

12강 행동트리에서 질문이 있습니다.

0

51

1

위젯 사이즈랑 위치 질문드려요.

0

81

3

행동트리의 데코레이션 관련하여 질문이 있습니다.

0

93

3

VS 2026 의 문제일까요?

0

476

2

에셋참조 블루프린트질문

0

66

2

애님 몽타주 콤보 관련질문

0

70

2

ThirdPerson CDO 에러가 생깁니다.

0

95

3

캐릭터가 움직이지 않습니다.

0

176

4

쿠킹 폴더 지정시 , Item 이외에는 지정하지 않는지 궁금합니다.

0

62

2

TSoftObjectPtr 를 사용했음에도, 메모리에 로드 됩니다.

0

93

2

7강에 나오는 생성자에 대해서 궁금합니다.

0

77

2

6강을 마무리하며 트레이스 채널 을 이해하지 못했습니다.

0

73

2

3강을 마무리 하며, 카메라가 움직이지 않습니다.

0

70

2

Use Controller Rotation 옵션값이 궁금합니다.

0

83

2

3강 입력 시스템 적용 중, 5.6 버전은 입력 매팅이 2개 입니다.

0

64

2

PlayerController 에 대헤 제가 잘못 이해한 것 같습니다.

0

78

2

13강 UpdateStat 부분에서 문제를 겪고 있습니다.

0

63

2

BP_PlayerController의 CustomEvent노드 이유가 궁금합니다.

0

64

1

콤포넌트 포인터 선언시 TObjectPtr<>과 UStaticMeshComponent* 차이점

0

72

2

CharacterMovementComponent의 RotationRate관련해서 질문이 있습니다.

0

113

2

언리얼 공부방법에 대해 질문드립니다.

0

82

2

4강 에서 이상한 그림자가 남습니다.

0

42

1

2강에서 카메라 회전안되시는분 참고

2

84

2