UE4中使用数据表(Data Table)

发表于2016-12-07
评论0 1.81w浏览

本文依据官方文档数据驱动游戏性元素整理而来。

做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决。下面我们来简单说一下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 Icon;
 
    // 注意此变量名跟csv中的不同,但是我把它的DisplayName设置成了"BlueprintKey"这样也是可以的
    // 还有注意我使用了TAssetSubclassOf而不是TAssetPtr,因为如果是类的话需要使用这个。
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test", DisplayName = "BlueprintKey")
    TAssetSubclassOf BP;
};

  

代码编译完成后,我们就可以把刚才创建好的csv文件导入到编辑器中,通过Import导入文件,导入后如下图所示:

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

注意:

在上述数据表示例中,引用的资产为延迟加载资产(TAssetPtr 处理此事项,我们最终使用了LoadAssetLoad Class Asset来实现异步加载,注意右上角的时钟图标)。如果资产字段类型设置为 UTexture,则将在加载数据表时加载所有资产。关于UE4中资源的同步和异步加载问题,将在另一篇文章中单独来讨论。

  • 【版权声明】
    原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。 
  • 本文出处:http://www.cnblogs.com/ghl_carmack/p/5677248.html

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引