애셋을 로딩하기 위해 사용한 생성자 코드의 ConstructorHelpers 클래스 용도는 
게임 시작 전 단계에서 애셋이 정확히 있는지 검증하기 위한 목적이 있다고 설명드렸습니다.

하지만     시작전에 검증되어야 할 필수 애셋이 있는 반면, 
있던 없던 스트리밍 방식으로 천천히 로딩되도 큰 상관이 없는 애셋도 있습니다.  

전자를 하드 레퍼런싱(Hard Referencing),  
후자를 소프트 레퍼런싱(Soft Referencing)이라고 하는데,


이번 강좌에서는 소프트 레퍼런싱 방식(Soft Referencing)으로 로딩해봅시다. 

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

 

//ABPawn.h
{
private:
	UPROPERTY(config)
	TArray<FStringAssetReference> CharacterAssets;
}    
//DefaultGame.ini
MaxHP=1000.0
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Barbarous.SK_CharM_Barbarous 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/sk_CharM_Base.sk_CharM_Base 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Bladed.SK_CharM_Bladed 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Cardboard.SK_CharM_Cardboard 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Forge.SK_CharM_Forge 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_FrostGiant.SK_CharM_FrostGiant 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Golden.SK_CharM_Golden 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Natural.SK_CharM_Natural 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Pit.SK_CharM_Pit 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Ragged0.SK_CharM_Ragged0 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_RaggedElite.SK_CharM_RaggedElite 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Ram.SK_CharM_Ram 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Robo.SK_CharM_Robo 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Shell.SK_CharM_Shell 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_solid.SK_CharM_solid 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Standard.SK_CharM_Standard 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Tusk.SK_CharM_Tusk 
+CharacterAssets=/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Warrior.SK_CharM_Warrior

 

언리얼 엔진에서 런타임에서 애셋을 로딩하기 위해서 FStreamableManager라는 구조체를 
언리얼 오브젝트에서 선언하고 이를 통해 로딩하도록 고안되어 있습니다.

저는 게임 인스턴스 클래스에서 이를 지정해, 모든 액터들이 이를 사용할 수 있도록 지정하겠습니다. 

 

//ABCGameInstance.h
class ABC_API UABCGameInstance : public UGameInstance
{
public:

	UPOPERTY()
		FStreamableManager AssetLoader;

};

 

//ABPawn.cpp
#include "ABCGameInstance.h"

void AABPawn::BeginPlay()
{
	Super::BeginPlay();
	CurrentHP = MaxHP;
	int32 NewIndex = FMath::RandRange(0, CharacterAssets.Num() - 1);

	UABCGameInstance* ABCGameInstance = Cast<UABCGameInstance>(GetGameInstance());

	if (ABCGameInstance)
	{
		TAssetPtr<USkeletalMesh> NewCharacter = Cast<USkeletalMesh>(ABCGameInstance->AssetLoader.SynchronousLoad(CharacterAssets[NewIndex]));
		if (NewCharacter)
		{
			Mesh->SetSkeletalMesh(NewCharacter.Get());
		}
	}
}

 

 

플레이 버튼을 누르면 시작할 때마다 랜덤하게 다른 캐릭터들로 변신하는 것을 볼 수 있습니다. 

 


 

하드 레퍼런싱

'Unreal > Concept' 카테고리의 다른 글

UObject , AActor  (0) 2019.05.29
Level (레벨)  (0) 2019.05.29
언리얼 INI 파일 설정 기능  (0) 2019.05.29
BlueprintImplementableEvent, BlueprintNativeEvent  (0) 2019.05.28
ConstructorHelpers + 애셋 로딩 시점관련  (0) 2019.05.28

+ Recent posts