KoreanFoodie's Study

언리얼 런타임 애셋 로딩 ( + Soft Referencing) 본문

Game Dev/Unreal C++ : Study

언리얼 런타임 애셋 로딩 ( + Soft Referencing)

GoldGiver 2022. 3. 31. 12:06

하드 레퍼런싱 vs 소프트 레퍼런싱 

CDO 생성시, 생성자에서 애셋의 유무를 확인하기 위해 ConstructorHelpers 함수를 호출해 애셋을 로드한다. 하지만 게임 시작 전에 반드시 존재하는지 체크할 필요가 없는 경우도 있는데, 전자의 경우를 하드 레퍼런싱(Hard Referencing), 후자를 소프트 레퍼런싱(Soft Referencing) 이라고 한다.

 

소프트 레퍼런싱 방식을 사용할 시 애셋의 정보를 가져올 때에는 FStringAssetReference 구조체를, 애셋의 클래스 정보를 가져올 때에는 FStringClassReference 구조체에 경로 정보를 지정해주면 된다. 여러 애셋을 가져올 때는 TArray 형식을 사용하면 된다.

 

ABPawn.h (로딩한 애셋을 실제 사용할 언리얼 오브젝트 클래스)

...
private:
    UPROPERTY(config)
    TArray<FStringAssetReference> CharacterAssets;
...

 

 

/Script.ArenaBattle.ABPawn

[/Script/ArenaBattle.ABPawn]
MaxHP=1000.0
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Barbarous.SK_CharM_Barbarous

TArray 배열을 사용하는 경우에는 '+' 를 붙여 애셋을 링크해줄 수 있다. 그럼 이제 실제로 애셋을 로드해 보자.

먼저, ABGameInstance 에 FStreamableManager 변수를 선언해주면 된다.

 

ABGameInstance.h

...
   UPROPERTY()
   FStreamableManager AssetLoader;
...

 

그 후, ABPawn.cpp 에서 ABGameInstance.h 를 include 하고 멤버 함수를 호출만 시켜주면 된다!

ABPawn.cpp

void ABPawn::BeginPlay()
{
	...
    
    UABGameInstance* ABGameInstance = Cast<UABGameInstance>(GetGameInstance());
    TAssetPtr<USkeletalMesh> NewCharacter = 
    	Cast<USkeletalMesh>(ABGameInstance->AssetLoader.SynchronousLoad(CharacterAssets[0]));
}

SynchronousLoad 는 동기화 방식으로, 애셋이 로딩될 때까지 게임 플레이 로직이 멈춘다! 비동기 방식으로 애셋을 로드하는 방법은 Delegate 를 이용하면 된다.

Comments