본문 바로가기
게임 개발/Unreal Engine

[Unreal Engine] 어셋 참조 및 로딩

by 불타는홍당무 2022. 2. 7.

UDN 링크
어셋 참조
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/Assets/ReferencingAssets
어셋 로딩
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/Assets/AsyncLoading/

어셋 강 참조 vs 약 참조

어셋을 참조하는 방식은 강 참조(Strong Reference)와 약 참조(Weak Reference)가 있다.

  • 강 참조 : A오브젝트가 B오브젝트를 참조하여 A로드 시 B가 로드되게 하는 방식이다. 오브젝트가 로드될 때 같이 로드되기 때문에 먹는 메모리가 커지고, 로딩 시간도 길어질 수 있다.
  • 약 참조 : 경로(Path)같은 문자열 형태의 간접 매커니즘을 통해 A오브젝트가 B오브젝트를 참조하게 만들어 로드하는 방식

강 참조 유형1 - 직접 프로퍼티 참조

변수 선언 후 UPROPERTY 매크로를 통해 에디터에 노출한다. 해당 변수에 참조할 어셋을 끌어다 놓는다.

강 참조 유형2 - 생성 시간에 참조

주어진 프로퍼티에 대해 로드해야하는 어셋을 프로그래머가 정확히 알고 있어, 해당 오브젝트 생성 시 일부분으로 설정하는 경우이다. ConstructorHelpers라는 특수 클래스가 사용되고, 생성 단계 도충 오브젝트나, 오브젝트 클래스를 찾게 해준다.

약 참조 유형1 - 간접 프로퍼티 참조

어셋 로드를 쉽게 제어할 수 있는 방법은 TSoftObjectPtr를 사용하는 것이다. TSoftObjectPtr를 사용하려면 어셋을 수동으로 로드해야 하는데 동기식 방법과 비동기식 방법이 있다.

  • 동기식 방법
    LoadObject<>()
    StaticLoadObject()
    FString fileName = TEXT("/Game/TestDataTable.TestDataTable);
    auto loadedFile = StaticLoadObject(UDataTable::StaticClass(), NULL, fileName);
    StreamManager::LoadSynchronous()
    FindOrLoadAssetsByPath()
    TArray<UObject> dataFiles;
    FindOrLoadAssetsByPath(TEXT("/Game"), dataFiles, EngineUtils::ATL_Regular);
  • 비동기식 방법
    • StreamableManager::RequestAsyncLoad()
    • LoadPackageAsync()

약 참조 유형2 - 객체(Object)검색/로드

지금까지는 UPROPERTY 기반이었고, 실행 시간에 String을 만들어 그 객체로의 레퍼런스를 구하는 방법이다. 내부적으로는 FindObject와 동일한 역할이므로, 오브젝트를 먼저 검색한 다음 로드할 필요가 없다.

  • 이미 생성되어 있거나 로드되어 있는 UObject만 사용하려는 경우 : FindObject<>()
  • 이미 로드되어 있지 않은 오브젝트를 로드하려는 경우 : LoadObject<>()