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++代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /** 注意此结构体中的成员变量的名字要跟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 // 注意此变量名跟csv中的不同,但是我把它的DisplayName设置成了"BlueprintKey"这样也是可以的 // 还有注意我使用了TAssetSubclassOf而不是TAssetPtr,因为如果是类的话需要使用这个。 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test" , DisplayName = "BlueprintKey" ) TAssetSubclassOf }; |
代码编译完成后,我们就可以把刚才创建好的csv文件导入到编辑器中,通过Import导入文件,导入后如下图所示:
在蓝图里面用法如下图所示:
注意:
在上述数据表示例中,引用的资产为延迟加载资产(TAssetPtr 处理此事项,我们最终使用了LoadAsset和Load Class Asset来实现异步加载,注意右上角的时钟图标)。如果资产字段类型设置为 UTexture,则将在加载数据表时加载所有资产。关于UE4中资源的同步和异步加载问题,将在另一篇文章中单独来讨论。
- 【版权声明】
原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。 - 本文出处:http://www.cnblogs.com/ghl_carmack/p/5677248.html