UE4开发偶尔会碰到特殊的需求,得获取整个项目中某种特定格式资源的所有路径,如 mesh 又或者 particleSystem,如下所示
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<FAssetData> 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资源的所有路径
FAssetRegistryModule,FARFilter
TArray<FAssetData> arrayAssetData;
FAssetRegistryModule& assetRegistryModule = FModuleManager::GetModuleChecked<FAssetRegistryModule>("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