본문 바로가기
Unreal/Asset

[Unreal] AssetRegistry

by 카피마스터 2025. 4. 5.

언리얼 프로젝트 내 모든 에셋에 대한 정보를 효율적으로 저장, 검색, 관리할 수 있게 도와주는 시스템

 

주요기능

빠른 검색 - 에셋을 효율적으로 필터링하고 찾을 수 있음

의존성 관리 - 에셋 간의 의존성을 파악

 

사용 방법

검색할 수 있는 에셋 타입( 참고 )

 

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