查看: 310|回复: 7

[编程指南] 【资源注册表 | Unreal Engine】

[复制链接]

1

主题

273

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
73036
发表于 2016-6-26 02:02:43 | 显示全部楼层 |阅读模式



Asset Registry(资源注册表) 是一个编辑器子系统,它在编辑器加载资源过程中,异步地收集卸载的资源的信息。 该信息存储在内存中,以便编辑器不必加载这些资源就可以创建资源列表。 该信息是权威信息,且随着资源在内存中发生改变或者文件在磁盘中发生改变,该信息可以自动更新。 内容浏览器 是该系统的主要用户,但是这个信息可以在编辑器代码中的任何地方进行应用。
获得资源列表
要想按类别形成一个资源列表,仅需加载 Asset Registry模块,然后调用 Module.Get().GetAssetsByClass()</code> 即可。
FAssetRegistryModule AssetRegistryModule = FModuleManager::LoadModuleCheckedFAssetRegistryModule("AssetRegistry");TArrayFAssetData AssetData;const UClass* Class = UStaticMesh::StaticClass();AssetRegistryModule.Get().GetAssetsByClass(Class, AssetData);
这将会返回一系列 FAssetData</code> 对象,它们描述了可以加载或卸载的资源。 FAssetData</code> 对象存放了关于资源的信息,该信息在加载该资源之前就可以确定。

这里是其成员的列表及介绍:


成员
描述

FName ObjectPath</code>资源的对象路径,以 包.组资源文件名称.资源资源文件名称</code> 形式呈现。FName PackageName</code>在其中找到该资源的包的资源文件名称。FName PackagePath</code>在其中找到该资源的包的路径。FName GroupNames</code>在其中找到该资源的组的资源文件名称,资源文件名称以 '.</code>' 分隔。 如果没有组,则资源文件名称为 NAME_None</code>  。FName AssetName</code>没有包或组的资源的资源文件名称。FName AssetClass</code>资源类的资源文件名称。TMapFName, FString TagsAndValues</code>标记为 AssetRegistrySearchable</code> 的属性的值的映射表。 请参照标签和值 部分获得更多信息。
您也可以通过调用以下其中一个函数,来使用其他标准来构成一个列表:


函数
描述

GetAssetsByPackageName()</code>返回指定包中的资源列表。GetAssetsByPath()</code>返回指定路径中的资源列表。GetAssetByObjectPath()</code>返回具有指定对象路径的资源列表。GetAssetsByTagValues()</code>返回具有一组指定标签和值的资源列表。GetAllAssets()</code>返回所有资源的列表。 这个过程可能很慢。
如果需要使用多个标准来形成一个资源列表,那么请使用 GetAssets()</code> 并提供一个FARFilter</code>结构体 ,正如 创建过滤器 部分所介绍的那样。
将FAssetData转换为UObject*
FAssetData</code> 对象有一个 GetAsset()</code> 函数,该函数将会返回 FAssetData</code>所代表的  UObject*</code> 。 如果需要,这将会加载该资源,然后返回它。

如果仅是想判断一个资源是否已加载,请使用 IsAssetLoaded()</code> 函数。
创建过滤器
当调用 GetAssets()</code> 创建资源列表时,可以提供 FARFilter</code>来通过多个标准筛选资源。 过滤器由多个部分组成:

PackageName(包资源文件名称)

PackagePath(包路径)

Collection(收藏夹)

Class(类)

Tags/Value pairs(标签/值 对)

一个构成部分可以有多个元素。 一个资源如果满足 所有 构成部分的要求,则通过过滤器。 要想满足一个构成部分的要求,那么该资源必须满足该构成部分中的 每个 元素的要求。

比如,如果存在一个静态网格物体,路径是 /Game/Meshes/BeachBall:

如果过滤器仅包路径/Game/Meshes</code>,则该资源通过过滤器。 该过滤器仅有一个构成部分,且该构成部分仅有一个元素。

如果过滤器包路径 /Game/Meshes</code> 和 类 UParticleSystem</code> 及 UStaticMesh</code>,那么该资源将通过过滤器。 这个过滤器有两个构成部分,第一部分有一个元素,第二部分有两个元素。

如果过滤器包路径 /Game/Meshes</code> 和 唯一的  类 UParticleSystem</code> ,那么该资源将不能通过过滤器。 该过滤器有两个构成部分,每个部分有一个元素。

如果过滤器包含路径 /Game/NotMeshes</code> 和类UStaticMesh</code>,那么该资源将不能通过过滤器。 该过滤器也具有两个构成部分,但每个部分有一个元素。

这里是一个应用过滤器的示例,该过滤器由Class(类)和PackagePath(路径)两个构成部分构成:
FAssetRegistryModule AssetRegistryModule = FModuleManager::LoadModuleCheckedFAssetRegistryModule("AssetRegistry");TArrayFAssetData AssetData;FARFilter Filter;Filter.Classes.Add(UStaticMesh::StaticClass());Filter.PackagePaths.Add("/Game/Meshes");AssetRegistryModule.Get().GetAssets(Filter, AssetData);标签和值
从资源注册表中返回的 FAssetData</code> 对象包含一个资源文件名称和数值的映射表,称为 TagsAndValues</code> 。 这是 FAssetData</code> 代表的资源的属性资源文件名称和相关值的列表。 该信息是在保存一个资源时收集的,且存储在包含该资源的 UAsset</code>  文件的头文件中。 资源注册表读取这个头文件并相应地填充  TagsAndValues</code>  映射表。 资源注册表仅收集标记为 AssetRegistrySearchable</code> 的属性。

比如(来自 UTexture</code> ):
/** 当对该贴图进行采样时所使用的贴图过滤方式。 */UPROPERTY(Category=Texture, AssetRegistrySearchable)TEnumAsByteenum TextureFilter Filter;
一旦该标记添加到了 UTexture</code> 的 'Filter' 属性上,那么后续保存的所有 UTextures</code> 在其  FAssetData</code> 的 TagsAndValues</code> 映射表中都有一项键值对: 键名是 "Filter"</code> ,值是一个枚举值的字符串表示,比如 "TF_Linear"` 。

在资源注册表可以发现这些资源的属性之前, 必须重新保存资源 。

如果您想让资源注册表可以搜索一条不直接是UProperty的信息 ,那么您资源的类可以实现这个虚函数: GetAssetRegistryTags()来手动地向TagsAndValues 映射表中添加键/值 对。 GetAssetRegistryTags继承于UObject。
异步数据收集
资源注册表异步地读取  UAsset</code> 文件,且在您需要资源列表时它可能还没有完整的资源列表。 如果您的编辑器代码需要一个完整的列表,那么资源注册表会提供一个代理回调函数,来提供什么时候发现/创建资源、重命名资源、或删除资源的信息。 还有一个代理用于提供什么时候资源注册表完成第一次搜索的信息,这对于很多系统来说是非常有用的。

您可以通过加载Asset Registry模块来注册这些代理,然后使用 IAssetRegistry</code> 内提供的函数:
/** 在资源被添加到注册表时注册/取消注册函数调用 */virtual FAssetAddedEvent OnAssetAdded() = 0;/** 在资源从注册表移除时注册/取消注册函数调用 */virtual FAssetRemovedEvent OnAssetRemoved() = 0;/** 在资源于注册表中重命名时注册/取消注册函数调用 */virtual FAssetRenamedEvent OnAssetRenamed() = 0;/** 在资源注册表完成文件载入时时注册/取消注册函数调用 */virtual FFilesLoadedEvent OnFilesLoaded() = 0;/** 注册/取消注册函数调用来更新背景文件载入的进度 */virtual FFileLoadProgressUpdatedEvent OnFileLoadProgressUpdated() = 0;/** 如资源注册表当前正在载入文件并且尚不知道所有的资源,则返回true */virtual bool IsLoadingAssets() = 0;
比如:
void FMyClass::FMyClass(){    // 载入资源注册表模块以监听更新    FAssetRegistryModule AssetRegistryModule = FModuleManager::LoadModuleCheckedFAssetRegistryModule("AssetRegistry");    AssetRegistryModule.Get().OnAssetAdded().AddRaw( this, FMyClass::OnAssetAdded );}FMyClass::~FMyClass(){    // 载入资源注册表模块以取消注册代理    FAssetRegistryModule AssetRegistryModule = FModuleManager::LoadModuleCheckedFAssetRegistryModule("AssetRegistry");    AssetRegistryModule.Get().OnAssetAdded().RemoveAll( this );}void FMyClass::OnAssetAdded(const FAssetData AssetData){    // 由资源注册表发现的资源。    // 这意味着其刚刚被创建或最近在硬盘上被发现。    // 请确认此函数中的代码速度够快,否则它会让收集过程变慢。}
资源注册表可以用于命令行开关中,但是这时会同步地收集信息。 直到收集信息完成之前, LoadModule()</code> 调用将会被阻止。

如果您的代码需要等待异步发现的资源,并具有 Slate用户界面 前端,那么它应该包含一个  SAssetDiscoveryIndicator</code> 控件来向用户呈现进度。
回复

使用道具 举报

0

主题

1277

帖子

3949

积分

vip会员

Rank: 1

积分
3949
发表于 2016-7-2 19:27:34 来自手机 | 显示全部楼层
好久没给力点的了。谢谢
回复 支持 反对

使用道具 举报

0

主题

877

帖子

2880

积分

vip会员

Rank: 1

积分
2880
发表于 2016-7-3 23:19:09 | 显示全部楼层
全就行啊,,支持 一下
回复 支持 反对

使用道具 举报

0

主题

856

帖子

2877

积分

vip会员

Rank: 1

积分
2877
发表于 2016-7-4 11:30:29 | 显示全部楼层
我是收集控~多谢分享~
回复 支持 反对

使用道具 举报

0

主题

862

帖子

2832

积分

vip会员

Rank: 1

积分
2832
发表于 2016-7-7 18:10:50 | 显示全部楼层
快没金币了,看看需要多少?
回复 支持 反对

使用道具 举报

0

主题

846

帖子

2774

积分

vip会员

Rank: 1

积分
2774
发表于 2016-7-7 21:57:37 | 显示全部楼层
我知道楼主一向黑~~~~~
回复 支持 反对

使用道具 举报

0

主题

894

帖子

2940

积分

vip会员

Rank: 1

积分
2940
发表于 2016-7-16 22:17:44 来自手机 | 显示全部楼层
什么游戏看看
回复 支持 反对

使用道具 举报

0

主题

825

帖子

2720

积分

vip会员

Rank: 1

积分
2720
发表于 2016-7-24 03:38:24 来自手机 | 显示全部楼层
啊啊啊啊,好多好多好多
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部