게임 개발/Unreal Engine 기본

Unreal Engine의 TSoftObjectPtr 이란?

지노윈 2026. 1. 2. 14:00
반응형

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) 불러낼 수 있는 것과 같은 원리입니다.

반응형