언리얼 프로젝트 내 모든 에셋에 대한 정보를 효율적으로 저장, 검색, 관리할 수 있게 도와주는 시스템
주요기능
빠른 검색 - 에셋을 효율적으로 필터링하고 찾을 수 있음
의존성 관리 - 에셋 간의 의존성을 파악
사용 방법
검색할 수 있는 에셋 타입( 참고 )
ex) UStaticMesh
// 헤더 추가
#include "AssetRegistry/AssetRegistryModule.h"
void SearchAssets()
{
// AssetRegistry 모듈 로드
FAssetRegistryModule& assetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
IAssetRegistry& assetRegistry = assetRegistryModule.Get();
// 결과 에셋 리스트
TArray<FAssetData> assetDataList;
// 필터(여기서는 에셋을 클래스로 검색)
FARFilter filter;
{
// 해당 에셋클래스의 자식 클래스 에셋 까지 검색
filter.bRecursiveClasses = true;
// StaticMesh 검색
filter.ClassPaths.Add(UStaticMesh::StaticClass()->GetClassPathName());
// 내 프로젝트에서만 검색(엔진 컨텐츠는 검색하지 않게)
filter.PackagePaths.Add(TEXT("/Game"));
// 하위 경로까지 검색
filter.bRecursivePaths = true;
}
// 대상 에셋 검색
assetRegistry.GetAssets(filter, assetDataList);
// 결과 출력
UE_LOG(LogTemp, Log, TEXT("------------------Start--------------"));
for (FAssetData& assetData : assetDataList)
{
UE_LOG(LogTemp, Log, TEXT("%s"), *assetData.ObjectPath.ToString());
}
UE_LOG(LogTemp, Log, TEXT("------------------End--------------"));
}
사용자 클래스로 만든 블루 프린트 검색
사용자 클래스로 블루프린트를 생성시 에셋 타입은 사용자 클래스가 아닌 Blueprint 타입이다
사용자 클래스를 사용하는 블루프린트를 검색하고 싶은경우
FARFilter::TagsAndValues 에 "ParentClass" 에 대상 클래스를 설정하여 검색할 수 있다
필터 수정
// 필터(여기서는 에셋을 클래스로 검색)
FARFilter filter;
{
// 해당 에셋클래스의 자식 클래스 에셋 까지 검색
filter.bRecursiveClasses = true;
// *이부분 수정* Blueprint 검색
filter.ClassPaths.Add(UBlueprint::StaticClass()->GetClassPathName());
// *이부분 추가* 부모 클래스가 특정 타입인 에셋을 찾는다
filter.TagsAndValues.Add(FName("ParentClass"), FString(TEXT("/Script/CoreUObject.Class'/Script/OldWorld.OWPlayerController'")));
// 내 프로젝트에서만 검색(엔진 컨텐츠는 검색하지 않게)
filter.PackagePaths.Add(TEXT("/Game"));
// 하위 경로까지 검색
filter.bRecursivePaths = true;
}
여기서 ParentClass의 값을 사용되는 경로("/Script/CoreUObject.Class'/Script/OldWorld.OWPlayerController'") 는
C++ 클래스 우클릭 -> 레퍼런스 복사를 선택하면 얻을수 있다
사용자 클래스와 상속 관계에 있는 블루 프린트들 검색
위의 방식은 딱 해당 클래스를 사용하는 블루프린트만 검색할 수 있지만
상속관계에 있는 모든 클래스로 만든 블루프린트를 검색하고 싶은경우는 사용할 수 없다
ex) UUserWidget을 상속받아 클래스를 만든 후 이 클래스로 블루프린트를 만든경우에는 UUserWidget으로 검색할 수 없다
이 경우는 블루 프린트 에셋을 모두 얻어와 UClass를 로드하여 상속관계를 확인하는 방식으로 처리해야한다
void SearchAssets()
{
// AssetRegistry 모듈 로드
FAssetRegistryModule& assetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
IAssetRegistry& assetRegistry = assetRegistryModule.Get();
// 결과 에셋 리스트
TArray<FAssetData> assetDataList;
// 필터(여기서는 에셋을 클래스로 검색)
FARFilter filter;
{
// 해당 에셋클래스의 자식 클래스 에셋 까지 검색
filter.bRecursiveClasses = true;
// StaticMesh 검색
filter.ClassPaths.Add(UBlueprint::StaticClass()->GetClassPathName());
// 내 프로젝트에서만 검색(엔진 컨텐츠는 검색하지 않게)
filter.PackagePaths.Add(TEXT("/Game"));
// 하위 경로까지 검색
filter.bRecursivePaths = true;
}
assetRegistry.GetAssets(filter, assetDataList);
// 결과 출력
UE_LOG(LogTemp, Log, TEXT("------------------Start--------------"));
for (FAssetData& assetData : assetDataList)
{
FString generatedClassPath;
// 태그를 검색해서 사용되는 클래스를 얻는다
if (true == assetData.GetTagValue(TEXT("GeneratedClass"), generatedClassPath))
{
// 클래스 로드
UClass* classObj = LoadObject<UClass>(nullptr, *generatedClassPath);
// 상속 관계 확인
if (nullptr != classObj && classObj->IsChildOf(UUserWidget::StaticClass()))
{
UE_LOG(LogTemp, Log, TEXT("%s"), *assetData.ObjectPath.ToString());
}
}
}
UE_LOG(LogTemp, Log, TEXT("------------------End--------------"));
}
여기서는 GeneratedClass를 사용했는데 ParentClass를 사용해도 같은 UUserWidget의 상속관계에 있기 때문에 결과는 동일하다
GeneratedClass : 블루프린트가 생성하는 UClass 객체
ParentClass : 블루 프린트의 부모 클래스
'Unreal > Asset' 카테고리의 다른 글
[Unreal] Asset 타입 (0) | 2025.04.05 |
---|---|
[Unreal] 패키지 경로 (0) | 2023.12.09 |
[Unreal] Package와 Asset (0) | 2023.12.09 |
[Unreal] 사용자 정보를 .uasset 파일로 저장 (0) | 2023.10.22 |