내일배움캠프/TIL

TIL260515 - Unreal

옆집히드라 2026. 5. 15. 21:03

1. 핵심 개념


  • 언리얼 스마트 포인터
  • MCP 구조 연구

2. 상세 내용


2.1. 언리얼 스마트 포인터

UE5 이후로는 GC에 의해 삭제되는지 여부를 체크하는 IsPendingKill()이 deprecated이므로 IsValid()로 통일햠

종류 설명
TObjectPtr UE5에서 도입된 기본 포인터 방식. 메모리 로드 시 TObjectPtr로 연결된 리소스도 같이 로드됨
TWeakObjectPtr UObject에 대한 약참조입니다. GC에 의해 객체가 소멸되어도 안전하게 감지할 수 있습니다.(널체크 해줌)
TSoftObjectPtr 객체를 경로(Path) 문자열로 참조합니다. 필요할 때만 메모리에 로드(동기/비동기)하여 메모리를 절약합니다.

사용 예시

// TWeakObjectPtr 예시 -----------------------------------------------
TWeakObjectPtr<AActor> TargetActor;

// CPP 사용
TargetActor = GetWorld()->SpawnActor<AActor>(...);

// 어딘가에서 TargetActor->Destroy()가 호출되었다고 가정

// 사용 전 유효성 검사 (null 및 GC 삭제 대기 상태 모두 체크됨)
if (TargetActor.IsValid())
{
    TargetActor->SetActorLocation(FVector(0, 0, 0));
}
else
{
    // 액터가 이미 파괴되었거나 메모리에서 해제됨
}

// TSoftObjectPtr ---------------------------------------------------
UPROPERTY(EditAnywhere)
TSoftObjectPtr<UStaticMesh> SoftMeshPtr;

// 1. 이미 메모리에 로드되어 있는지 확인 (IsValid)
if (SoftMeshPtr.IsValid())
{
    UStaticMesh* LoadedMesh = SoftMeshPtr.Get();
}
else
{
    // 2. 에셋이 경로만 있고 로드되지 않은 상태라면(Pending 상태라면) 동기 로드
    // IsPending()은 "경로는 있지만 메모리에 없다"는 의미로 쓰일 수 있음.
    if (SoftMeshPtr.IsPending())
    {
        // 동기 로드 (게임이 잠깐 멈출 수 있음)
        UStaticMesh* LoadedMesh = SoftMeshPtr.LoadSynchronous();

        // 비동기 로드는 FStreamableManager를 통해 수행해야 함
    }
}

2.2. MCP 구조 연구

언리얼에서는 MVVM 아키텍처가 이미 존재해서 사실 그걸 쓰면 되지만 언리얼을 처음 배우는 팀 간 작업을 고려 + 2주 분량의 게임 볼륨을 고려했을 때 과도한 모델이라고 생각해서 직접 MCP 구조를 구현해서 프로젝트 UI를 설계했다.

 

MCP 구조에서 Presenter는 프로젝트의 실정에 맞춰서 엄밀한 규격을 따르기 보다는 유연성 있게 UIBasePresenter 클래스의 virtual bind 메서드만 구현해도 바인딩이 가능하게 설계했고 UIBase는 순수한 View로써 기능하도록 기능 분리를 하는데 신경을 썻다.

 

이때 UIManager는 모든 UI를 띄우면서 동시에 레퍼런스를 가지는 싱글턴 패턴(로컬 섭시스템으로 구현)으로 설계하였는데, UIBase와 UIBasePresenter를 알맞게 매칭하도록 내부적으로 UIBindingDataAsset을 사용하여 알맞게 UI가 바인딩 되도록 했다.

3. 질문 및 해결 (Q&A)


  • 언리얼에서의 인터페이스 구현은 왜 이렇게 어렵고 또 강제성이 없는가

4. 관련 문서 (Links)


'내일배움캠프 > TIL' 카테고리의 다른 글

TIL260521 - Unreal  (0) 2026.05.21
TIL260518 - VFX  (0) 2026.05.18
TIL260514 - perforce  (0) 2026.05.14
TIL260513 - Unreal  (0) 2026.05.13
TIL260512 - Unreal  (0) 2026.05.12