UE5) 에셋 매니저

JellyPower·2023년 7월 4일
1

언리얼 메모장

목록 보기
3/4
post-thumbnail
  • 언리얼 엔진이 제공하는 에셋을 관리하는 싱글톤 클래스
  • 보통 언리얼 엔진이 HDD에 있는 에셋을 메모리에 올려야 하는지에 대한 에셋 관리는 자동으로 해주지만 이를 개발자가 정확하게 제어해주려면 Asset Manager를 사용할 수 있음
  • 원래는 파일시스템에 있는 파일들을 프로그램의 메모리로 로딩하는 과정을 프로그래머가 직접 해줘야 하지만 언리얼 엔진은 이러한 기능들을 에셋 매니저 클래스를 통해 어느정도 자동화가 가능하게 도와줌

Primary Asset

  • 언리얼 엔진의 에셋들은 크게 Primary Asset과 Secondary Asset으로 나뉨
  • Primary Asset:
    • 에셋 매니저가 직접적으로 처리하고 로딩 가능한 에셋들은 Primary Asset으로 분류된다.
    • 가장 대표적인 예시로는 UWorld 에셋들을 들 수 있다. (UWorld 에셋은 자동으로 Primary Asset이다.)
      • UWorld와 같은 맵에 대한 정보는 언리얼 엔진 프로젝트를 생성하면 디폴트 세팅으로 에셋 매니저가 참조할 수 있도록 해줌

    - 유저는 이를 통해 직접 시스템 디렉토리에 접근하지 않아도 에셋 매니저를 통해 내가 원하는 에셋에 접근 가능하다.
  • Secondary Asset:
    • 에셋 매니저가 직접적으로 처리하고 로딩 가능하지 못하는 에셋들
    • 대부분의 에셋들은 Secondary Asset이다.
      • 언리얼을 프로그래밍 해보면 대부분의 에셋들을 디렉토리 뿐 아니라 에셋 매니저를 통해서 직접 로딩해주지 않아도 된다.
      • 이는, 이미 대부분의 에셋들은 UWorld라는 World에셋에 담겨 있어서 UWorld가 로딩될 때 같이 로딩되는 Secondary Asset이기 때문에 직접 로딩해줄 필요가 없기 때문이다.
  • GetPrimaryAssetID():
    • 해당 함수를 오버라이드 한다면, 월드와 같이 기본적으로 내가 디스크에서 직접 로딩하는 등의 기능이 가능한 PrimaryAsset을 직접 만들어 줄 수 있다.
    • FPrimaryAssetId(FPrimaryAssetType InAssetType, FName InAssetName)
      • 위 함수가 리턴하는 구조체이며 적합한 에셋 ID를 입력하면 “디렉토리를 참조하는 에셋매니저가 관리하는 Primary Asset”에 직접적으로 접근할 수 있다.

사용 예시

  1. Project Settings > Asset Manager 탭을 통해 내가 참조하고자 하는 Primary Asset이 있는 디렉토리를 설정한다.

    - Priamary Asset Type: 내가 접근할 때 사용할 에셋 타입에대한 이름 정보
    - Base Class: 모아두고자 하는 에셋의 Base 클래스
    - Directories: 로딩할 에셋이 있는 디렉토리
  1. PrimaryAsset으로 활용하고자 하는 에셋에서 해당 에셋이 어떤 PrimaryID를 가지는지에 대해 기술하는 GetPrimaryAssetId()함수를 오버라이드 해준다.
class ARENABATTLE_API UABItemData : public UPrimaryDataAsset
{
	GENERATED_BODY()
public:
	virtual FPrimaryAssetId GetPrimaryAssetId() const override
	{
		return FPrimaryAssetId("ABItemData", GetFName());
	}
};
  1. 엔진이 초기화 될 때 생성되는 Asset Manager싱글톤 C++클래스를 통해 에셋에 직접 접근한다.
UAssetManager& Manager = UAssetManager::Get();
// 1. Asset Manager 싱글톤 클래스를 얻어온다.

TArray<FPrimaryAssetId> OutAssets;
Manager.GetPrimaryAssetIdList(TEXT("ABItemData"), OutAssets);
// 2. 내가 위에 설정한 Priamary Asset Type에 해당하는 Type정보를 파라미터로 넘겨주면
// 해당하는 에셋들의 리스트들을 넘겨준다.

int32 AccessIdx = 2;
FSoftObjectPtr AssetPtr(Manager.GetPrimaryAssetPath(OutAssets[AccessIdx ]));
// 3. 에셋의 경로를 통해 에셋에 대한 FSoftObjectPtr을 얻어온다.

if(AssetPtr.IsPending())
{
	AssetPtr.LoadSynchronous();
	// 4. 에셋을 로딩해온다.
}
Item = Cast<UABItemData>(AssetPtr.Get());
// 5. 로딩된 에셋을 사용한다.

주의할 점

  • 에셋 매니저와 TSoftObjectPtr, FsoftObjectPtr과 같은 놈들은 디렉토리에 직접적으로 접근하는 시스템이라고 볼 수 있음.
  • 다른 말로 하면 (만약 해당 데이터가 메모리에 캐싱돼있지 않다면) 런타임에 HDD에 직접적으로 접근한다고 볼 수 있음
  • 그렇기에 해당 시스템들은 미리 모든 데이터를 메모리에 직접 올려놓지 않아 메모리 사용을 줄이는 장점을 가진다고 할 수도 있지만 반대로 런타임에 HDD에 접근하는 고비용 작업을 진행하기에 프레임 드랍의 큰 원인이 될 수 있음.
profile
게임엔진코드싸개(진)

0개의 댓글