本文依据官方文档数据驱动游戏性元素整理而来。
做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决。下面我们来简单说一下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++代码如下所示:
1234567891011121314151617181920212223242526 /** 注意此结构体中的成员变量的名字要跟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导入文件,导入后如下图所示: