반응형
TObjectPtr이 "이미 로드된 객체를 어떻게 가리킬 것인가"에 집중한다면, TSoftObjectPtr은 "아직 로드되지 않은 객체를 어떻게 안전하게 가리키고, 원할 때 로드할 것인가"에 특화된 스마트 포인터입니다.
1. Hard Reference vs Soft Reference
가장 큰 차이는 메모리 로드 타이밍입니다.
- Hard Reference (TObjectPtr, UPROPERTY 포인터): A 클래스가 B 에셋을 하드 참조하면, A가 메모리에 로드될 때 B도 반드시 함께 로드됩니다. 이를 "줄줄이 비엔나"처럼 연쇄 로딩이 발생한다고 표현하며, 메모리 낭비의 주범이 됩니다.
- Soft Reference (TSoftObjectPtr): A가 B를 소프트 참조하면, A가 로드되어도 B는 로드되지 않습니다. 대신 B가 있는 경로(Path) 문자열만 가지고 있습니다. 실제 객체는 개발자가 코드로 "지금 로드해!"라고 명령할 때만 메모리에 올라옵니다.
2. 주요 특징 및 장점
- 메모리 최적화: 게임 시작 시 모든 무기, 캐릭터, 맵 데이터를 로드할 필요 없이, 플레이어가 해당 아이템을 획득하거나 지역에 진입할 때만 로드할 수 있습니다.
- 비동기 로딩 지원: 게임이 멈추지 않게 백그라운드에서 에셋을 로드하는 FStreamableManager와 함께 자주 사용됩니다.
- 안전한 참조: 객체가 메모리에서 해제되었는지 여부를 추적할 수 있어, 댕글링 포인터(Dangling Pointer) 문제를 방지합니다.
3. 실전 사용법 (C++)
TSoftObjectPtr은 일반 포인터처럼 바로 쓸 수 없고, 동기화(Load) 과정이 필요합니다.
// 1. 선언 (헤더 파일)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Assets")
TSoftObjectPtr<UStaticMesh> MeshPtr;
// 2. 사용 (소스 파일)
// 현재 메모리에 로드되어 있는지 확인
if (MeshPtr.IsPending())
{
// 방법 A: 동기 로드 (잠깐 멈춤 발생 가능)
UStaticMesh* LoadedMesh = MeshPtr.LoadSynchronous();
}
// 이미 로드되어 있다면 Get()으로 바로 가져올 수 있음
UStaticMesh* Mesh = MeshPtr.Get();
if (Mesh)
{
// 로직 수행
}
4. 언제 사용해야 할까요?
| 상황 | 추천하는 포인터 |
| 항상 사용되는 필수 컴포넌트 (예: 캐릭터의 Mesh) | TObjectPtr (Hard) |
| UI 아이콘, 특정 퀘스트에서만 나오는 NPC | TSoftObjectPtr (Soft) |
| 수백 개의 아이템 데이터 시트 | TSoftObjectPtr (Soft) |
| 레벨에 배치된 다른 액터 참조 | TSoftObjectPtr (Soft) |
5. 요약하자면
TSoftObjectPtr은 "주소" 대신 "주소록(경로)"을 들고 있는 것과 같습니다. 주소록만으론 사람(객체)을 직접 만날 수 없지만, 필요할 때 전화를 걸어(Load) 불러낼 수 있는 것과 같은 원리입니다.
반응형
'게임 개발 > Unreal Engine 기본' 카테고리의 다른 글
| Unreal Engine의 Data Table과 TSoftObjectPtr 활용한 응 (1) | 2026.01.02 |
|---|---|
| Unreal Engine 비동기 로딩 (0) | 2026.01.02 |
| 블루프린트의 Construction Script(CS) 노드와 SCS (0) | 2025.12.30 |
| Unreal Engine SCS(Simple Construction Script) (0) | 2025.12.30 |
| Unreal Engine CDO 사용 방법 (0) | 2025.12.30 |