[UE5] AssetManager

GamzaTori·2024년 10월 7일

UE5 C++

목록 보기
7/27
  • Project Settings → Engine → Asset Manager
  • 리소스 매니저 역할로 초반에 에셋을 모두 불러 읽어와 들고있으며 필요없으면 unload 하기도 한다
  • AssetManager를 상속받은 class 생성
    // header
    UCLASS()
    class PROJECT_API URAssetManager : public UAssetManager
    {
    	GENERATED_BODY()
    
    public:
    	URAssetManager();
    
    	static URAssetManager& Get();
    };
    // cpp
    URAssetManager::URAssetManager() : Super()
    {
    }
    
    URAssetManager& URAssetManager::Get()
    {
    	if(URAssetManager* Singleton = Cast<URAssetManager>(GEngine->AssetManager))
    	{
    		return *Singleton;
    	}
    
    	UE_LOG(LogTemp, Fatal, TEXT("Can't find URAssetManager"));
    	return *NewObject<URAssetManager>(); 
    }
    • 에셋 매니저는 싱글톤 패턴으로 구현
  • DataAsset을 상속받은 클래스 생성
    // header
    class UInputAction;
    class UInputMappingContext;
    
    // GameplayTag에 대응되는 Action 1개를 갖고있는 구조
    USTRUCT()
    struct FRInputAction
    {
    	GENERATED_BODY()
    
    public:
    	UPROPERTY(EditDefaultsOnly)
    	FGameplayTag InputTag = FGameplayTag::EmptyTag;
    	
    	UPROPERTY(EditDefaultsOnly)
    	TObjectPtr<UInputAction> InputAction = nullptr;
    };
    
    UCLASS()
    class PROJECT_API URInputData : public UDataAsset
    {
    	GENERATED_BODY()
    
    public:
    	UPROPERTY(EditDefaultsOnly)
    	TObjectPtr<UInputMappingContext> InputMappingContext;
    
    	UPROPERTY(EditDefaultsOnly)
    	TArray<FRInputAction> InputActions;
    };
    • FGameplayTag를 사용하기 위해서 GameplayTagContainer.h가 필요하다
    • EditDefaultsOnly 옵션이 있어야 Data Asset에 정상적으로 표기된다
  • 위에서 만든 RInputData을 상속받은 Data Asset 생성

  • 우클릭 → Miscellaneous → Data Asset
  • 만들어준 Input Mapping Context와 Input Action, GameplayTag를 선택
  • Data Asset은 Secondary Data Asset으로 실제로 AssetManager를 통해서 데이터를 load/unload 하는것은 Primary Data Asset이 수행한다
  • Primary Data Asset을 상속받은 class 생성
    // header
    // 하나의 엔트리로 에셋의 이름, 경로 등을 가지고 있음
    USTRUCT()
    struct FAssetEntry
    {
    	GENERATED_BODY()
    
    public:
    	UPROPERTY(EditDefaultsOnly)
    	FName AssetName;
    
    	UPROPERTY(EditDefaultsOnly)
    	FSoftObjectPath AssetPath;		// 경로를 설정할 수 있는 타입
    
    	UPROPERTY(EditDefaultsOnly)
    	TArray<FName> AssetLabels;
    	
    };
    
    // 에셋에 대한 정보를 가지고 있는 FAssetEntry를 배열로 가지고 있음 
    USTRUCT()
    struct FAssetSet
    {
    	GENERATED_BODY()
    
    public:
    	UPROPERTY(EditDefaultsOnly)
    	TArray<FAssetEntry> AssetEntries;
    };
    
    /**
     * 
     */
    UCLASS()
    class PROJECT_API URAssetData : public UPrimaryDataAsset
    {
    	GENERATED_BODY()
    
    public:
    
    private:
    	// C++의 Unordered_map에 가까움
    	UPROPERTY(EditDefaultsOnly)
    	TMap<FName, FAssetSet> AssetGroupNameToSet;
    	
    };
    
  • 위에서 만든 RAssetData를 상속받은 Data Asset 생성

  • RAssetData가 위의 구조를 가지고 있다
  • Name이 매칭되지 않을경우 로딩을 못할수도 있기 때문에 Tag를 사용하는 것이 좋다
  • AssetPath는 지정해둔 FSoftObjectPath 타입이고 에셋을 선택할 수 있다
  • Label는 부가 정보를 가지고 있는다
  • Project Settings → Asset Manager 에서 만들어준 Primary Asset Data를 추가해야 한다

profile
게임 개발 공부중입니다.

0개의 댓글