UE4中使用数据表(Data Table)
本文依据官方文档数据驱动游戏性元素整理而来。
做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决。下面我们来简单说一下UE4中如何使用DataTable来实现数据驱动开发。
顾名思义,数据表就是以有意义且有用的方式将各种相关的数据归类的表格, 其中,数据字段可以是任何有效的 UObject 属性,包括资产引用。在设计师将 CSV 文件导入数据表前,程序员必须创建行容器以指示引擎如何解释数据。 这些数据表包含了列名,这些列名和基于代码的UStruct结构以及它的(子)变量一一对应, 这个UStruct的结构必须继承自FTableRowBase才可以被导入器辨识。
我们随便建了一张测试表(csv)如下所示:
Id,HP,Icon,BlueprintKey
1,100,Texture2D'/Game/FirstPerson/Textures/Test.Test',Class'/Game/FirstPerson/BP_DataTableTest.BP_DataTableTest_C'
2,200,Texture2D'/Game/FirstPerson/Textures/Test.Test',Class'/Game/FirstPerson/BP_DataTableTest.BP_DataTableTest_C'
其中BP_DataTableTest是一个继承自AActor的一个蓝图类,BP_DataTableTest_C是实际生成的蓝图类。
对应的C++代码如下所示:
/** 注意此结构体中的成员变量的名字要跟csv表中的相同,因为它是UE4里面是通过反射系统来实现数据的
初始化的,当然名字不同也可以,但是它的元数据中的DisplayName就必须跟表中的字段值对应,具体可以参考
DataTableCSV.cpp中的实现就可以了解。*/
USTRUCT(BlueprintType)
struct FDataTableTestData : public FTableRowBase
{
GENERATED_USTRUCT_BODY() public: FDataTableTestData()
: HP(0)
{} UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test")
int32 HP; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test")
TAssetPtr<UTexture2D> Icon; // 注意此变量名跟csv中的不同,但是我把它的DisplayName设置成了"BlueprintKey"这样也是可以的
// 还有注意我使用了TAssetSubclassOf而不是TAssetPtr,因为如果是类的话需要使用这个。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test", DisplayName = "BlueprintKey")
TAssetSubclassOf<AActor> BP;
};
代码编译完成后,我们就可以把刚才创建好的csv文件导入到编辑器中,通过Import导入文件,导入后如下图所示:

在蓝图里面用法如下图所示:

注意:
在上述数据表示例中,引用的资产为延迟加载资产(TAssetPtr 处理此事项,我们最终使用了LoadAsset和Load Class Asset来实现异步加载,注意右上角的时钟图标)。如果资产字段类型设置为 UTexture,则将在加载数据表时加载所有资产。关于UE4中资源的同步和异步加载问题,将在另一篇文章中单独来讨论。
UE4中使用数据表(Data Table)的更多相关文章
- 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成
孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天经过反复折腾,最终基本上算 ...
- 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数
孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天打算完成的是通用的(至少目 ...
- Openvswitch原理与代码分析(5): 内核中的流表flow table操作
当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行acti ...
- C# 如何获取SQL Server 中指定数据表的所有字段名和字段类型
如何获取指定数据表的所有字段名和字段类型.SqlConnection.GetSchema方法有2个重载形式,获取指定数据表的所有字段名和字段类型的秘密就在GetSchema (String, Stri ...
- Oracle 过程中检查数据表存在与否
在过程中,尤其是每天执行的任务,通常要检查查询的数据表存在不存在,如果不存在则等待一段时间在进行执行,以下代码实现了这个功能,如果表不存在,抛出异常,交给异常处理代码,确保数据完整性 使用方法:p_C ...
- Lua中的weak表——weak table
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
- Lua中的weak表——weak table(转)
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
- R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...
- SQLyog中创建数据表及相关查询方法
USE du; /*1.创建账务表 id name mony*/ CREATE TABLE zhangwu(id INT PRIMARY KEY AUTO_INCREMENT, sname VARCH ...
随机推荐
- SphinxSE 一些SQL查询语句
1.查询STRUCTURE_ID=106562并且COL1=2 或者 COL1=0 或者 COL2=2,对TS进行排序,从第10条开始取1000条. SELECT ID FROM T_RESOURCE ...
- 1204. Maze Traversal
1204. Maze Traversal A common problem in artificial intelligence is negotiation of a maze. A maze ...
- QQ 微信 新浪 无法 分享 收集
1.网络请求报错.升级Xcode 7.0发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Secur ...
- .NET易忘备留 ORACLE存储过程调用
1.Oracle存储过程调用[返回信息,单体或者列表] public IResult FundBuild(string partnerId,string userId, DateTime beginD ...
- linux shell 获取进程pid
1.通过可执行程序的程序名称 a.运行程序 b.获取进程id号 c.pidof相关知识:http://www.cnblogs.com/yunsicai/p/3675938.html 2.有些程序需要在 ...
- ubuntu上安装Eclipse时遇到的一个错误
A Java Runtime Environment (JRE) or Java Development Kit (JDK)must be available in order to run Ecli ...
- PLSQL Developer注册码
Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca
- JS判断客户端系统 让ipad iphone 等手持设备自动跳到手机版
if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iPad)/i))) { location.replace("http:// ...
- 不正确使用WeakHashMap引起的卡死
公司的jenkins今天出了一点问题,起来以后,总是处于等待状态,所有的任务无法正常加载.登陆界面也出不了.而且cpu占用率100% 把线程导出来,看到: “Loading job NMS_Patch ...
- Object对象类
Object对象类是所有类的祖先,他是默认自动继承的 Java为什么要做一个对象类呢?对象类的目的就是归一了类型,他就是把所有的类所有的对象归纳成为 Object类型.因为对象他认为对象应该拥有一些什 ...