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中资源的同步和异步加载问题,将在另一篇文章中单独来讨论。

时间: 2024-12-28 01:12:37

UE4中使用数据表(Data Table)的相关文章

案例:Oracle exp dmp文件损坏 通过CPFL工具抽取dmp中的数据表进行恢复

Oracle数据库逻辑导出exp的dmp文件损坏,通过非常规恢复抽取dmp文件中表的数据 在有些时候,exp的dmp文件因为某种原因损坏(比如磁盘异常,exp过程损坏等),导致imp导入无法继续,下面的处理方法(直接读取dmp文件)来对dmp文件进行抢救性恢复,最大程度减少数据丢失损失 1.创建exp dmp文件并使用dd破坏 SQL> create table t_xifenfei as select * from dba_objects; Table created. SQL> selec

Lua中的weak表——weak table

弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak references,元素为弱引用的表就叫弱表.有弱引用那么也就有强引用,有引用那么也就有非引用.我们先要厘这些基本概念:变量.值.类型.对象. (1)变量与值:Lua是一个dynamically typed language,也就是说在Lua中,变量没有类型,它可以是任何东西,而值有类型,所以Lua中没

Openvswitch原理与代码分析(5): 内核中的流表flow table操作

? 当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行action之后,直接发送这个包,只有在内核无法查找到流表项的时候,才会到用户态查找用户态的流表.仅仅查找内核中flow table的情况被称为fast path. ? ? 第一步:从数据包中提取出key ? 实现函数为int ovs_flow_key_extract(const struct ip_tun

Lua中的weak表——weak table(转)

弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak references,元素为弱引用的表就叫弱表.有弱引用那么也就有强引用,有引用那么也就有非引用.我们先要厘这些基本概念:变量.值.类型.对象. (1)变量与值:Lua是一个dynamically typed language,也就是说在Lua中,变量没有类型,它可以是任何东西,而值有类型,所以Lua中没

Oracle 过程中检查数据表存在与否

在过程中,尤其是每天执行的任务,通常要检查查询的数据表存在不存在,如果不存在则等待一段时间在进行执行,以下代码实现了这个功能,如果表不存在,抛出异常,交给异常处理代码,确保数据完整性 使用方法:p_CheckTable('UserName.TableName')用户名不存在,则在所有表中查找 create or replace procedure p_CheckTable(p_TableName in varchar2)  asv_count number;v_TableName varchar

JDBC中获取数据表的信息

摘自:http://blog.chinaunix.net/uid-145458-id-2799926.html 1. JDBC连接MYSQL的代码很标准,很简单.   class.forName("com.mysql.jdbc.Driver").newInstance();   Connection conn = DriverManager     .getConnection("jdbc:mysql://localhost/test?user=root&passwo

SQLyog中创建数据表及相关方法

USE du; /*1.创建账务表 id name mony*/ CREATE TABLE zhangwu(id INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(200), money DOUBLE); /*2.插入数据*/ INSERT INTO zhangwu VALUES(1,'吃饭支出',666); INSERT INTO zhangwu VALUES(2,'睡觉支出',666); INSERT INTO zhangwu VALUES(3,'打

SAE中创建数据表

Step1:进入新浪云应用数据库 点击应用名称,进入到该应用管理界面 在数据库服务中点击"共享型MySQL" 在接下来的页面中点击"管理MySQL" 此时会让你输入安全密码,当你输入安全密码之后会跳转到数据库界面 上图为我已经创建过的数据表 Step2:创建数据表 数据表(带有3个字段,id为主键,且为自动增长) 填写数据表名和字段数 (记得点击"执行") 接下来弹出的界面 填写字段信息 填写完信息记得点击"执行"和"

用C# ASP.net将数据库中的数据表导出到Excel中

需要用到组件GridView和一个button即可. 给GridView添加一个数据源, 选择你想要的数据库中的表的字段,添加成功后GridView中就显示数据. 再添加一个button,双击控件添加相对应的功能代码 功能代码如下: protected void Button1_Click(object sender, EventArgs e) { string FileName = "得分表 " + DateTime.Now + ".xls"; Response.