(UE4 4.20)UE4获取所有特定资源(FAssetData)的资源路径

UE4开发偶尔会碰到特殊的需求,得获取整个项目中某种特定格式资源的所有路径,如 mesh 又或者 particleSystem,如下所示

(UE4 4.20)UE4获取所有特定资源(FAssetData)的资源路径_第1张图片

 

UE4筛选某类资源(FAssetData)的资源路径有两种方法:

UObjectLibrary和FAssetRegistryModule,FARFilter

 

UObjectLibrary

想筛选Content文件夹下static mesh类资源的所有路径,代码如下:

	UObjectLibrary* objectLibrary = UObjectLibrary::CreateLibrary(UStaticMesh::StaticClass(), false, GIsEditor);
	if (objectLibrary)
	{
		objectLibrary->AddToRoot();
	}
	
	objectLibrary->LoadAssetDataFromPath(TEXT("/Game"));
	TArray arrayAssetData;
	objectLibrary->GetAssetDataList(arrayAssetData);

	for (int32 index = 0; index < arrayAssetData.Num(); ++index)
	{
		UE_LOG(LogTemp, Error, TEXT("%s"), *arrayAssetData[index].ObjectPath.ToString());
	}

大概就是利用UObjectLibrary和FAssetData两个关键结构。

运行结果,筛选所有staticmesh资源的所有路径

(UE4 4.20)UE4获取所有特定资源(FAssetData)的资源路径_第2张图片

FAssetRegistryModule,FARFilter

	TArray arrayAssetData;
	FAssetRegistryModule& assetRegistryModule = FModuleManager::GetModuleChecked("AssetRegistry");
	FARFilter filter;
	filter.PackagePaths.Add("/Game");
	filter.ClassNames.Add(UStaticMesh::StaticClass()->GetFName());
	filter.ClassNames.Add(UTexture::StaticClass()->GetFName());
	filter.bRecursivePaths = true;
	filter.bRecursiveClasses = true;
	assetRegistryModule.Get().GetAssets(filter, arrayAssetData);
	

	for (int index = 0; index < arrayAssetData.Num(); ++index)
	{
		UE_LOG(LogTemp, Warning, TEXT("asset name is %s"), *arrayAssetData[index].GetFullName());
	}

 

UObjectLibrary 和 FAssetRegistryModule,FARFilter区别

UObjectLibrary加载了相应的所有资源进了内存,可以用FSoftObjectPtr检测下,发现用UObjectLibrary获取资源路径的同时也加载相应的资源为UObject; 而FAssetRegistryModule,FARFilter仅仅是获取资源的路径,相应的资源并没有被加载为UObject.

参考资料:

【1】 http://api.unrealengine.com/CHN/Programming/Assets/AsyncLoading/index.html

【2】Source\Runtime\AssetRegistry\Private\AssetRegistry.cpp

你可能感兴趣的:(UE4,Editor扩展)