一种高效的全局储存空间,用于储存带有USTRUCT标记的数据结构序言
之前学习了UE5新的Gameplay功能EnhancedInput
今天,来学习下另一个小的新功能,一种新的数据配置方法:DataRegistry(简称DR)。主要学习资料还是官方的直播课:
一、问题来历
谈到数据配置,就不得不想到数据驱动开发,其带来了好多的用处,如
1.1 数据驱动优点
当前主流的数据驱动的形式分类如下
1.2 数据驱动形式分类
每一种的具体使用方式及优缺点可观看官方直播
喜欢文字的,这里有他人的笔记
那么这么多的数据配置方法每一种都有自己的数据读取方法,这太麻烦了。能不能有一种统领全局的数据配置方法,可以储存、合并、读取和管理不同来源的数据。于是DataRegistry出现了。
这听上去和CompositeDataTables(复合数据表)很类似,复合数据表不就是把多个DataTable组织在了一起吗?但DR比它更复杂,功能也更多。DR构架在DT之上,DR本身不直接配置数据,而是更好的组织数据,DT反倒会显得更底层一些。DR相当于从多个表里生成的临时数据,并且附送了许多优势与特征:
优势与特征
发展的脉络可以简单理解为DataTable->CompositeDataTable->DataRegistry。(DR的数据源可以来自不同的地方,根据你设置的ItemStruct而定,不仅仅是DT)
由于其更好的扩充及缓存机制等优点,Data Registries可能会是将来引擎上面统一的数据管理方法。在堡垒之夜中,已深度使用DR来管理数据。
二、核心概念
开启插件后,在杂项里就可以创建一个DR资产(简称DRA),其承继于UObject,用户可以承继DR来自定义自己的DR。
属性涵义2.1 数据源(DataSource)
数据注册表资产外置的四种数据注册表源类型,以链表保存
说到这儿,来瞧瞧DR的整体结构
2.2 标识符
在我们创建完一个DR资产后,当引用它的时侯怎样找到它呢?那必须在注册表类型(Registry Type)字段中指定全局惟一名称,用来标示这个DRA。
DR使用独有的标识符来查找数据注册表以及其中包含的单个数据项。这些标识符本质上都是基于字符串的名称。
不过FDataRegistryType(用于数据注册表资产)和FDataRegistryId(用于数据注册表中的单个数据项)结构却属于包装器(wrapper),能提供实用的编辑器内部功能。
在须要引用数据注册表资产的Actor中选择一个标识符,或者选择该数据注册表中的特定数据行
这里还有一个概念是ID Format,多加了一个筛选条件,可以配合GAS(游戏技能系统)使用,如果要用,就要在配表的时侯遵守规则。
2.3 创建的DRA是怎样加载到显存里的?
方式1:自动加载,通过Directories to Scan指定扫描目录。在项目设置下的Game里。
方式2:手动加载数据注册表
2.4 缓存机制
2.5 自定义数据Id的动态解析
可以承继自UDataRegistry 自定义自己想要的DataRegistry ,比如定义自己想要的ID解析规则,不是仅仅依据字段。这是在DataRegistry 层级
还可以在全局,对所有DataRegistry 都生效的方式,只要承继自FDataRegistryResolver
然后通过右图所示,注册到全局DataRegistry
具体的用法还是通过视频可以更好的理解
三、基本用法
3.1 流程展示
1.开启插件
2.设置DR扫描目录
3.创建DRA
配置如下图后,得到相应了数据,之后便可以进行读取。蓝图C++都提供了许多函数进行访问,并且支持异步。
4. 设置相应属性获得数据,之后就可以在你想用的地方读了,是只读的
快速读取函数参考
具体的用法可以参考视频中的使用,通过本文可以读DataRegistry有个基本的了解~
参考: