TObjectPtr과 TSoftObjectPtr은 둘 다 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→ 아직 로드되지 않은 에셋을 필요 시점에 불러오기 위한 참조에 사용 (예: 아이콘, 사운드, 메시 등 콘텐츠 데이터).
'알아두면 좋은 것들(언리얼 관련 여러 잡다한 정보)' 카테고리의 다른 글
| 언리얼 콜백함수 (0) | 2025.09.26 |
|---|---|
| BTTaskNode 와 BTTaskNode_BlackboardBase (0) | 2025.09.16 |
| BTTaskNode 에 존재하는 Task들 (0) | 2025.09.15 |
| SweepMultiByChannel() 을 이용한 액터 감지 (1) | 2025.08.25 |
| 언리얼 오브젝트 풀링 이란 (3) | 2025.08.19 |