有的时候我们需要对当前工程下的特定资源进行一些操作,比如找到所有图片资源或者所有静态模型资源,然后把这些资源信息发到某个UI上进行操作等等
本文对UE4资源注册模块AssetRegistry
进行简单的分析
目前蓝图已经封装了相应的库,可以非常方便的调用
Asset Registry
模块负责处理引擎下的资源信息(收集/检索*.uasset
),从这个模块中可以读取到所有资源信息(FAssetData
)
FAssetData
主要参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| FName ObjectPath;
FName PackageName;
FName PackagePath;
FName AssetName;
FName AssetClass;
FAssetDataTagMapSharedView TagsAndValues;
TArray<int32> ChunkIDs;
|
在获取Asset
的时候需要填充一个结构体参数FARFilter
,里面的参数部分类似上述参数,之后再看
FARFilter
对资源进行检索的时候的过滤参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| TArray<FName> PackageNames;
TArray<FName> PackagePaths;
TArray<FName> ObjectPaths;
TArray<FName> ClassNames;
TMultiMap<FName, TOptional<FString>> TagsAndValues;
RecursiveClassesExclusionSet;
bool bRecursivePaths;
bool bRecursiveClasses;
bool bIncludeOnlyOnDiskAssets;
|
比较需要注意的是ClassNames
这个参数,这个类型并不是我们场景中对象的类型,打个比方,我们场景里的玩家一般是ACharacter
,但是我们的资源其实就是Blueprint
,所以在填充这个结构体的时候并不能用*.::StaticClass()
来给与Class
类型
一般情况资源的创建类型就是用右键创建出来的名称或类似的名称,并且都是继承自Object
FAssetRegistryState
储存了读取asset后的相关信息,用作磁盘内容的cache数据,用于描述asset registry当前的状态,可以由IAssetRegistry进行使用和维护。把这些数据单独组成一个FAssetRegistryState类,是为了减少耦合性,因为引擎中除asset registry外的其他模块 也需要用到这些数据。
主要方法
我们可以通过static TScriptInterface<IAssetRegistry> GetAssetRegistry();
获取单例
蓝图亦可以

1
| static UObject* GetAsset(const FAssetData& InAssetData);
|
通过上述方法可以自定义的根据FARFliter
参数来获取所需的资源数据
如果不清楚每个参数的含义,可以反向的通过下面方法来查看
1
| static FAssetData CreateAssetData(const UObject* InAsset, bool bAllowBlueprintClass = false);
|
1 2 3
| bool GetAssetsByPackageName(FName PackageName, TArray<FAssetData>& OutAssetData, bool bIncludeOnlyOnDiskAssets = false) const; bool GetAssetsByPath(FName PackagePath, TArray<FAssetData>& OutAssetData, bool bRecursive = false, bool bIncludeOnlyOnDiskAssets = false) const; bool GetAssetsByClass(FName ClassName, TArray<FAssetData>& OutAssetData, bool bSearchSubClasses = false) const;
|
上面三个方法根据不同方式来获取对应的资源
1
| void GetSubPaths(const FString& InBasePath, TArray<FString>& OutPathList, bool bInRecurse) const;
|
基于一个基础路径获取子路径,比较有用
1 2
| bool GetReferencers(FName PackageName, TArray<FName>& OutReferencers, EAssetRegistryDependencyType::Type InReferenceType = EAssetRegistryDependencyType::Packages) const; bool GetDependencies(FName PackageName, TArray<FName>& OutDependencies, EAssetRegistryDependencyType::Type InDependencyType = EAssetRegistryDependencyType::Packages) const;
|
获取引用和依赖关系,也很有用
1 2 3 4
| void SearchAllAssets(bool bSynchronousSearch); void ScanFilesSynchronous(const TArray<FString>& InFilePaths, bool bForceRescan = false); void ScanPathsSynchronous(const TArray<FString>& InPaths, bool bForceRescan = false);
|
扫描/搜索文件,不需要返回值,因为扫描以后文件就保存在FAssetRegistryState
内了