https://dev.epicgames.com/documentation/ko-kr/unreal-engine/asset-registry-in-unreal-engine
- 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이 들어있을 것이다.
- Asset Registry는 Commandlet에서도 사용될 수 있다.
'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 |