zoukankan      html  css  js  c++  java
  • 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 处理此事项,我们最终使用了LoadAssetLoad Class Asset来实现异步加载,注意右上角的时钟图标)。如果资产字段类型设置为 UTexture,则将在加载数据表时加载所有资产。关于UE4中资源的同步和异步加载问题,将在另一篇文章中单独来讨论。

  • 相关阅读:
    <<SQL Server 2005 高级程序设计>> 学习笔记(4)
    ASP.NET发布网站的二个小问题总结
    Android AlertDialog 实例
    SQL2005 导入其它服务器数据
    Android sysout.exit(0) 和finish()区别
    <<SQL Server 2005 高级程序设计>> 学习笔记(3)
    ASP.NET上传多个文件
    <<SQL Server 2005 高级程序设计>> 学习笔记(1)
    SurfaceView 间取得焦点
    图像处理类
  • 原文地址:https://www.cnblogs.com/ghl_carmack/p/5677248.html
Copyright © 2011-2022 走看看