https://dev.epicgames.com/documentation/ko-kr/unreal-engine/asset-registry-in-unreal-engine

 

언리얼 엔진의 에셋 레지스트리 | 언리얼 엔진 5.4 문서 | Epic Developer Community

언리얼 엔진 에디터에서 에셋을 검색하는 방법과 에셋을 로드하기 전에 에셋 유형에 대해 자세히 알 수 있는 방법을 설명합니다.

dev.epicgames.com

  • Editor가 Load되면서 Load되지 않은 Asset에 대한 정보를 Asynchronous하게 모드은 Editor Subsystem
    • Editor가 Asset을 Load하지 않고 List를 만들 수 있도록 Memory에 저장
    • 이 정보는 Authoritative하고 Memory의 Asset이나 Disk의 File이 변경 시 자동으로 최신화가 된다.
    • 주로 Contents Browser에서 쓴다.
      • 하지만 Editor Code 어디에서도 사용은 가능하다.

Asset List 구하기

  • 더보기
    	FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
    	TArray<FAssetData> AssetData;
    	const UClass* Class = UStaticMesh::StaticClass();
    	AssetRegistryModule.Get().GetAssetsByClass(Class->GetFName(), AssetData);
  • Asset의 Load/Unlaod 여부는 FAssetData로 반환한다.
  • 또한 FAssetRegistryModule(정확히는 IAssetRegistry)에서 아래 함수로 Category 별  List를 만들 수 있다.

FAssetData를 UObject*로 변환하기

Filter

  • GetAssets() 함수를 호출할 때 FARFilter를 사용해 여러 Category 별 Filtering 되는 Asset List를 만들 수 있다.
  • 하나의 Component에는 Element가 여러개 있을 수 있다.
    • Asset은 ARFilter의 모든 Component를 충족해야 한다.
    • 하나의 Component를 충족시키려면, Asset은 그 안의 Element 아무것에나 일치하면 된다.

TagAndValue

  • FAssetData가 나타내는 Asset의 Property Value와 관련된 값
  • Asset이 저장되면서 안에 들어있는 UAsset 파일의 Header에 기록될 때 수집 된다.
    • UPROPERTY(AssetRegistrySearchable)이 선언된 것들에 대해서만 수집한다.
    • 더보기
      	/** 이 텍스처를 샘플링할 때 사용할 텍스처 필터링 모드입니다. */
      	UPROPERTY(Category=Texture, AssetRegistrySearchable)
      	TEnumAsByte<enum TextureFilter> Filter;
      • 위 변수는 저장 될 때 Key는 "Filter"로, Value는 "TF_Linear"와 같은 enum TextureFilter의 문자열을 갖는다.
  • Asset Registry는 이 Header를 읽고 그에 맞게 TagAndValues를 채운다.
    • 반드시 저장을 해야 Asset Registry가 Property를 발견할 수 있다.
  • Asset Registry가 UPROPERTY가 아닌 정보를 검색 하게 할 수도 있다.
    • GetAssetRegistryTags()를 구현하여 TagsAndValues에 값을 수동으로 추가해준다.
    • 이 함수는 UObject에서 제공한다.

Asyncronous Data Discovery

  • Asset Registry는 UAsset 파일을 Async Load로 읽는다.
    • 때문에 요청한 시간에 모든 Asset List 전체가 없을 수 있다.
  •  Editor 코드에서는 전체 List를 요청하면 Registry에서 Asset과 관련된 여러 Delegate Call-back을 제공한다.
    • 더보기
      	/** 레지스트리에 에셋이 추가될 때에 대한 콜백을 등록/해제합니다.  */
      	virtual FAssetAddedEvent& OnAssetAdded() = 0;
       
      	/** 레지스트리에서 에셋이 제거될 때에 대한 콜백을 등록/해제합니다. */
      	virtual FAssetRemovedEvent& OnAssetRemoved() = 0;
       
      	/** 레지스트리에 에셋 이름이 변경될 때에 대한 콜백을 등록/해제합니다. */
      	virtual FAssetRenamedEvent& OnAssetRenamed() = 0;
       
      	/** 에셋 레지스트리가 파일 로드를 완료했을 때에 대한 콜백을 등록/해제합니다. */
      	virtual FFilesLoadedEvent& OnFilesLoaded() = 0;
       
      	/** 백그라운드 파일 로드 진행상황 업데이트를 위한 콜백을 등록/해제합니다. */
      	virtual FFileLoadProgressUpdatedEvent& OnFileLoadProgressUpdated() = 0;
       
      	/** 현재 에셋 레지스트리가 파일을 로드중이라 모든 에셋에 대해 알지 못하면 참을 반환합니다. */
      	virtual bool IsLoadingAssets() = 0;
  • 더보기
    	void FMyClass::FMyClass()
    	{
    		// 업데이트 감지를 위해 에셋 레지스트리 모듈을 로드합니다.
    		FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
    		AssetRegistryModule.Get().OnAssetAdded().AddRaw( this, &FMyClass::OnAssetAdded );
    	}
     
    	FMyClass::~FMyClass()
    	{
    		// 델리게이트 등록해제를 위해 에셋 레지스트리 모듈을 로드합니다.
    		FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
    		AssetRegistryModule.Get().OnAssetAdded().RemoveAll( this );
    	}
     
    	void FMyClass::OnAssetAdded(const FAssetData& AssetData)
    	{
    		// 에셋 레지스트리가 에셋을 발견했습니다.
    		// 즉 방금 생성되었거나 방금 디스크에서 찾았다는 뜻입니다.
    		// 이 함수의 코드가 빠른지 확인, 아니면 수집 프로세스가 늦춰집니다.
    	}
    • Asset Registry는 Commandlet에서도 사용될 수 있다.
      • 하지만 정보가 Async Load되지 않아 Load가 완료될 때까지 LoadModule() 호출이 Block된다.
    • Code가 Asset을 Async하게 Discover하기 기다리면서 Slate UI가 있는 경우,
      진행 상황을 사용자에게 알리는 SAssetDiscoveryIndicator Widget이 들어있을 것이다.

'UE5 > Architecture' 카테고리의 다른 글

[Architecture] Programming Subsystem  (0) 2024.05.06
[Architecture] String  (0) 2024.05.06
[Architecture] Asset Reference  (0) 2024.05.06
[Architecture] Module(+ Package)  (0) 2024.05.03
[Architecture] DataAsset과 Asset Manager  (0) 2024.05.03

+ Recent posts