2026-05-29(금) TSubclassOf, TWeakObjectptr, CreateWeakLambda

조범근·2026년 5월 29일

TIL

목록 보기
66/81

C++ Week 13

Study

개인 연습 프로젝트, 알고리즘 2문제



Today I Learned


UnrealC++

1. TSubclassOf vs TObjectPtr

TSubclassOf<AEnmey> enemyClass;

이건 Enemy 종류 중 스폰할 클래스를 저장하는 변수다. 아직 몬스터가 월드에 있지않는 설계도로만 존재한다.

TSubclassOf는
1. 이 타입을 상속한 클래스만 넣을 수 있음
2. 에디터에서 선택 가능한 클래스가 필터링됨
3. Blueprint 자식 클래스도 넣을 수 있음
4. SpawnActor, CreateWidget, GiveAblitiy처럼 "생성/부여" API와 잘 맞음
5. 아직 객체를 만들지 않아도 "무엇을 만들지" 저장 가능

만약 TSubclassOf가 단순히 Uclass로 클래스 타입을 가리킨다면, 그냥 TObjectPtr<UClass>로 가리키면 되는게 아닐까? 라고 생각해봤지만

UClass에 많은 것들이 담겨도 이상하지 않기 때문에, const처럼 의도를 명확하게 표시해줘야 사용 용도와 목적을 잊지 않고 코드를 읽을때 의도 파악이 쉽다.

class뽑을땐 TSubclassOf, 객체를 가져올땐 TObjectPtr



2. TWeakObjectPtr

TWeakObjectPtr<ACombatCharacterBase> CachedTarget;

이 말은 Target을 기억은 하고싶지만 죽거나 Destroy되면 invalid가 되도록 참조 하고 싶다 라는 것.

만약 LockOnSystem으로 비유를 하자면 플레이어가 적을 바라봐서 타겟으로 CachedTarget을 잡았다고 하자. 근데 그 적이 죽거나 월드에서 사라졌따?

거기에서 또 내가 TObjectPtr이나 강한 UPROPERTY 참조로 잡고 있으면 내가 참조 중이니까 GC 입장에서 아직 필요할 수도 있네? 같은 관계가 생겨 타겟의 수명에 영향을 줄 여지가 생김

그래서 TWeakObjectPtr은 UObject를 수명에 관여하고 싶지는 않지만, 참조하고 싶을때(약한 참조) 사용한다.



3. CreateWeakLambda

	ownerCharacter->GetWorldTimerManager().SetTimer(
		TimerHandle,
		FTimerDelegate::CreateWeakLambda(ownerCharacter, [ownerCharacter, Handle, ActorInfo, ActivationInfo, this]()
		{
			ownerCharacter->SetInvincible(false);
			UE_LOG(LogTemp, Warning, TEXT("Dodge End: Invincible OFF"));
		}),
		0.5f,
		false
		);

Lambda는 "익명 함수"이다. 그냥 Lambda를 타이머에 넣으면 문제가 생길 수 있다. 1초 뒤에 실행되는데, 그 전에 this가 사라지면? 예를 들어 Ability가 끝났거나, 캐릭터가 죽었거나, UObject가 정리됐으면?

그럼 람다 안에서 죽은 객체를 만질 수 있어서 위험하다.그래서 CreateWeakLambda를 사용한다.

캡처 앞의 ownerCharacter의 의미는 ownerCharacter가 아직 살아 있으면 람다 실행, 사라졌으면 람다 실행 안 함.

CreateWeakLambdaUObject 수명 체크가 붙은 람다 바인딩이다. 주의할 점은 앞의 ownerCharacter랑 뒤의 캡처 안의 ownerCharacter는 역할이 다르다.

앞의 ownerCharacter
-> 실행 전에 유효성 검사할 UObject

대괄호 안의 ownerCharacter
-> 람다 안에서 쓰기 위해 캡처한 변수

0개의 댓글