UE5 查找资源时可以用FARFilter进行筛选,之前可以用ClassNames进行筛选,但是5.1之后就弃用这个属性改成ClassPaths属性
构造一个FTopLevelAssetPath对象需要两个FName参数,但是没找到应该传什么
查找官方文档,明显是错误的,还是得自己动手丰衣足食
随便获取一个Texture类型的资源打断点查看资源发现FAssetData类中的AssetClassPath属性就是FTopLevelAssetPath类型,因此这就和前面FARFilter类中的ClassPaths属性对应上
还有一个比较简单的方法,选中资源右键Copy Reference
复制出来的路径就是 /Script/Engine.World'/Game/Untitled.Untitled' /Script/Engine
就是PackageName,World就是AssetName,其他资源同理可得,因此就可以通过筛选路径以及资源类型获取想要的资源
cpp
.h
public:
UFUNCTION(BlueprintCallable, Category = "Texture Utilities")
void PrintTextureNames(const FString& SearchPath);
cpp
.cpp
#include "AssetRegistry/AssetRegistryModule.h"
void UFunTool_GI::PrintTextureNames(const FString& SearchPath)
{
// 获取资产注册模块
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
// 创建一个资产过滤器 AssetClassPath = {PackageName="/Script/Engine" AssetName="Texture2D" }
FARFilter Filter;
Filter.bRecursivePaths = true;
Filter.ClassPaths.Add(FTopLevelAssetPath("/Script/Engine", "Texture2D"));
Filter.PackagePaths.Add(FName(*SearchPath));
// 用于存放结果的数组
TArray<FAssetData> AssetDatas;
AssetRegistryModule.Get().GetAssets(Filter, AssetDatas);
// 遍历所有找到的资产数据
for (const FAssetData& AssetData : AssetDatas)
{
// 打印资产的名称
UE_LOG(LogTemp, Log, TEXT("Found Texture: %s"), *AssetData.AssetName.ToString());
}
}
注意Path不要添加双引号不然会出问题,因为FString类型会自动加双引号
运行结果: