알아두면 좋은 것들(언리얼 관련 여러 잡다한 정보)

언리얼 C++ 에서 TSoftObjectPtr 와 TObjectPtr의 차이

Turtle_Jun 2025. 10. 21. 00:57

TObjectPtrTSoftObjectPtr은 둘 다 Unreal Engine 5에서 UObject를 참조하기 위한 포인터 템플릿이지만, 메모리에 존재하는 객체를 참조하느냐 혹은 에셋 경로만 저장하느냐에서 큰 차이를 보인다.


TObjectPtr

TObjectPtr언리얼 5에서 도입된 안전한 UObject 포인터 래퍼이다.

  • 역할: UObject*를 직접 감싸서, 댕글링 포인터(Dangling Pointer) 를 방지한다.
  • 메모리 상에 이미 로드된 객체를 참조하며, 실제로는 강/약 참조가 아닌 단순 포인터 역할만 한다.
  • 언리얼의 가비지 컬렉터(GC) 가 추적할 수 있는 구조를 제공한다.
  • 에디터 전용 기능 으로, 포인터의 유효성 검사·리로딩 추적 등의 이점을 제공한다.
  • 런타임 빌드에서는 거의 UObject*와 동일하게 동작한다.

예시:

UPROPERTY()
TObjectPtr<UMyActor> MyActor; // 메모리에 있는 실제 객체 참조

TSoftObjectPtr

TSoftObjectPtr에셋 경로를 저장하는 “지연 로드(Lazy Load)” 참조이다.

  • 역할: 객체가 아직 메모리에 로드되지 않아도 경로(String Reference) 로 유지된다.
  • 실제 객체가 필요할 때 LoadSynchronous() 또는 FStreamableManager 를 통해 (비)동기 로드가 가능하다.
  • 비로드 상태에서도 유효, 하지만 Get()을 호출하기 전에는 메모리 객체가 없다.
  • 패키지 경로 기반으로 저장되므로, 세이브 파일/블루프린트/에디터 에셋 필드에 적합하다.
  • 메모리 절약 및 초기 로딩 최적화에 유리하다.

예시:

UPROPERTY(EditAnywhere)
TSoftObjectPtr<UMaterial> MaterialAsset;

// 필요할 때 로드
UMaterial* LoadedMat = MaterialAsset.LoadSynchronous();

비교 요약

구분 TObjectPtr TSoftObjectPtr
참조 대상 메모리에 이미 존재하는 UObject 로드되지 않았을 수도 있는 에셋
저장 방식 실제 UObject 포인터 에셋 경로(FSoftObjectPath)
로딩 필요 여부 즉시 사용 가능 LoadSynchronous / Async 필요
GC 추적 지원함 직접 로드 시 추적 시작
주요 용도 런타임 메모리 객체 참조 에셋/리소스의 지연 로드 참조
메모리 장점 없음 (실객체 필요) 있음 (로드 전까지 비용 0)

결론적으로,

  • TObjectPtr → 이미 존재하는 객체를 안전하게 참조할 때 사용 (예: 스폰된 액터, 컴포넌트).
  • TSoftObjectPtr → 아직 로드되지 않은 에셋을 필요 시점에 불러오기 위한 참조에 사용 (예: 아이콘, 사운드, 메시 등 콘텐츠 데이터).