어셋 강 참조 와 약 참조
강참조 : 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<>()
TObjectPtr
:
TObjectPtr<UObject> MyObjectPtr = NewObject<UObject>();
TSubclassOf
:
TSubclassOf<AActor> MyActorClass = AMyActor::StaticClass();
FSoftClassPath
:
FSoftClassPath MyClassPath = FSoftClassPath(TEXT("/Game/MyFolder/MyClass.MyClass_C"));
TSoftClassPtr
:
TSoftClassPtr<UClass> MyClassPtr = TSoftClassPtr<UClass>(TEXT("/Game/MyFolder/MyClass.MyClass_C"));