【UE4】DataTable - 数据表

2023-11-18

本文使用 UE 4.26,引擎自带 ARPG 项目,从代码和编辑器两个方面记录一下 UE4 中的 DataTable,也就是数据表的用法。

一、DataTable 是什么

  DataTable 就是数据表(以下简称 DT),也就是二维的,M 行 N 列的矩阵,如下图所示:

在这里插入图片描述

  是一个 5 行(Row),三列(Col)的数据表。程序可以通过策划配置的数据表找到对应关系做相应的逻辑,对策划很友好。

二、编辑器中使用

2.1 创建一个数据表

  在编辑器中,右键,Miscellaneous -> DataTable 即可创建一个 DT:

在这里插入图片描述

  需要选择 Row (即列)的数据结构,比如选了 GameplayTagTableRow,就会创建一个如下所示的 DT:
在这里插入图片描述
在这里插入图片描述
  新创建的 DT 默认是空的, 点击 Add 按钮可以创建一个默认行,如果 DT 的列结构是代码里的,则默认值在代码中设置;如果 DT 的列结构是资源,则在资源中设置。这个例子中 GameplayTagTableRow 是代码里写的,所以默认值在代码中设置(没有设置默认值,所以 Tag 默认是 None,DevComment 默认是空):

/** Simple struct for a table row in the gameplay tag table and element in the ini list */
USTRUCT()
struct FGameplayTagTableRow : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

	/** Tag specified in the table */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=GameplayTag)
	FName Tag;

	/** Developer comment clarifying the usage of a particular tag, not user facing */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=GameplayTag)
	FString DevComment;

	/** Constructors */
	FGameplayTagTableRow() {}
	FGameplayTagTableRow(FName InTag, const FString& InDevComment = TEXT("")) : Tag(InTag), DevComment(InDevComment) {}
	GAMEPLAYTAGS_API FGameplayTagTableRow(FGameplayTagTableRow const& Other);

	/** Assignment/Equality operators */
	GAMEPLAYTAGS_API FGameplayTagTableRow& operator=(FGameplayTagTableRow const& Other);
	GAMEPLAYTAGS_API bool operator==(FGameplayTagTableRow const& Other) const;
	GAMEPLAYTAGS_API bool operator!=(FGameplayTagTableRow const& Other) const;
	GAMEPLAYTAGS_API bool operator<(FGameplayTagTableRow const& Other) const;
};

  点击 DT 中的一行,这一行会高亮,且可以在 Row Editor 中修改这一行的值(注意:代表行数的第一列,以及列名称是不能改的)
在这里插入图片描述

2.2 自定义数据表的列

  DT 的列在创建出来之后就固定了,不能随便加一列,删一列,如果需要自定义列的数据表,可以在 Content 里右键,创建一个 “Structure”(即结构):
在这里插入图片描述

  在 Structure 中可以新增变量,调整变量位置(越靠上,DT 中就越靠左),Default Values 里可以设置每一列的默认值(注意:变量和字符串值,都可以是中文):

在这里插入图片描述

  然后右键创建一个 DT,使用刚刚创建的自定义列结构,点击 Add,就能看到默认值:

在这里插入图片描述

三、代码中使用

3.1 使用代码创建一个列结构

  在代码中可以仿照 FGameplayTagTableRow 写一个:

USTRUCT(BlueprintType)
struct FTableRowTest : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

public:

	FTableRowTest() {}

	FTableRowTest(bool InLoop, int32 InCurrentCount, int32 InMaxNum, float InLifeTime)
		: bLoop(InLoop)
	    , CurrentCount(InCurrentCount)
		, MaxNum(InMaxNum)
		, LifeTime(InLifeTime)
	{
	}

	UPROPERTY(EditAnywhere, BlueprintReadOnly, DisplayName = "是否循环")
	bool		bLoop = false;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, DisplayName = "当前数量")
	int64		CurrentCount = 0;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, DisplayName = "最大数量")
	int64		MaxNum = 0;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, DisplayName = "生命周期")
	float		LifeTime = 0.f;
};

  这样就可以在编辑器中创建一个这个列结构的 DT 了(且由于是代码创建的列结构,在 Row Structure 里是跳转不过去的,如果是资源,能直接跳到结构资源):
在这里插入图片描述

3.2 通过代码读/写 DT

  在代码中可以直接通过资源路径和名称加载 DT,比如在 Content/TestForDT 目录下的 “MyTestDT”,可以这样加载:

UDataTable* const TestTable = LoadObject<UDataTable>(nullptr, TEXT("/Game/TestForDT/MyTestDT.MyTestDT"));

  然后就可以通过 void UDataTable::AddRow(FName RowName, const FTableRowBase& RowData) 来新增行了。比如:

TestTable->AddRow(FName("Bob"), FTableRowTest(true, 3, 8, 2.7f));

3.3 CSV、JSON

  DT 创建之后可以右键,导出成 CSV 或者 JSON 文件:
在这里插入图片描述

  编辑器中可以通过 Reimport 通过 CSV 或者 JSON 导入,具体格式试一试就知道了:
在这里插入图片描述

  在代码中(或者蓝图中)也可以直接通过 CSV 或者 JSON 创建一个 DT:

/** 
*	Create table from CSV style comma-separated string. 
*	RowStruct must be defined before calling this function. 
*	@return	Set of problems encountered while processing input
*/
ENGINE_API TArray<FString> CreateTableFromCSVString(const FString& InString);

四、注意事项

4.1 复制内容

  选中一行之后,如果想复制其中的内容是分两种情况的:

  1. 如果是第一列,即 Key,那么选中一行之后按 F2 即可
    在这里插入图片描述

  2. 如果是其他列,即 Value,那么选中一行之后在 Row Editor 中可以复制

4.2 排序

  DT 是可以按照某一列的值排序的,但是很扯淡的是:不管是什么类型,都是 TEXT 转成 FString 然后比较,源码如下(在 FDataTableEditor::OnColumnSortModeChanged 函数中):

if (InSortMode == EColumnSortMode::Ascending)
{
	VisibleRows.Sort([ColumnIndex](
		const FDataTableEditorRowListViewDataPtr& first, 
		const FDataTableEditorRowListViewDataPtr& second)
	{
		// 返回值:大于 0 表示 A > B; 0 表示相等; 小于 0 表示 A < B		
		int32 Result = (first->CellData[ColumnIndex].ToString()).Compare(second->CellData[ColumnIndex].ToString());
		
		if (!Result)
		{
			return first->RowNum < second->RowNum;
		}

		return Result < 0;
	});
}

  而 FString 的比较,是 字典排序,所以 99 > 963

在这里插入图片描述

  以及 2.87 > 11.09
在这里插入图片描述

  我自己的改法是直接把引擎改了,如果是 Numeric,用数值类型排序,而不是字符串:

VisibleRows.Sort([ColumnIndex](
	const FDataTableEditorRowListViewDataPtr& first, 
	const FDataTableEditorRowListViewDataPtr& second)
{					
	int32 Result = (first->CellData[ColumnIndex].ToString()).Compare(second->CellData[ColumnIndex].ToString());

	FString const FirstColumnStr = first->CellData[ColumnIndex].ToString();
    FString const SecondColumnStr = second->CellData[ColumnIndex].ToString();
    bool const bNumeric = FCString::IsNumeric(*FirstColumnStr) && FCString::IsNumeric(*SecondColumnStr);
    if (bNumeric)
    {
    	double const FirstNum = FCString::Atod(*FirstColumnStr);
        double const SecondNum = FCString::Atod(*SecondColumnStr);
        Result = (FirstNum > SecondNum) ? 1 : ((FirstNum < SecondNum) ? -1 : 0);
    }
				
	if (!Result)
	{
		return first->RowNum < second->RowNum;
	}

	return Result < 0;
});

五、参考资料

  1. UDataTable - Unrael Engine Document
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【UE4】DataTable - 数据表 的相关文章

随机推荐

  • 多任务学习

    一 单任务学习和多任务学习 多任务学习是和单任务学习对应的一种机器学习方法 单任务学习 在单任务学习中 认为不同任务之间是不具有关联性的 因此 每个模型的参数都是独立训练的 这样的学习方法有两个缺陷 由于每个任务中的训练数据有限 因此所训练
  • Qt5实现可配置截图及基于百度OCR自动识别标题保存文件

    需求 当我在看视频学习的时候 需要屏幕指定区域的内容保存起来 采用常见的XX截图软件 你需要选择区域选择路径保存 把文件命名为有意义的名称 效率极其低下 作为一名计算机专业人员强调思考能力 动手能力和内功修炼层级 所以这点事情还是很简单的
  • 无卡支付,快捷支付,认证支付,协议支付,代扣区别与联系

    无卡支付 快捷支付 认证支付 协议支付 代扣区别与联系 无卡支付 另外名称叫快捷支付 不需开通网银 只需提供银行卡卡号 户名 手机号码等信息 银行验证手机号码正确性后 第三方支付发送手机动态口令到用户手机号上 用户输入正确的手机动态口令 即
  • 标注一致性:Inter-Annotator Agreement(IAA)

    评价者之间的一致性 Kappas Inter rater agreement Kappas 简书
  • Acwing提高课DP二刷(考研复习)

    前言 本博客主要是为了准备考研数据结构自命题而写的 主要为个人复习使用 里面的题博主在大一大二基本都刷了若干遍 所以这里只写一些简单的思路和总结评语 供日后回顾复习使用 DP 1 acwing1010 导弹拦截 题目大意 利用若干组互相独立
  • vue for循环列表(插槽)输入数据操作

    vue for循环列表 插槽 输入数据操作 1 给循环的每一行的编辑框添加chang事件 输入框 参数 数据的唯一key 绑定的键名 event target value值 下拉框 参数 数据的唯一key 绑定的键名 event值 HTML
  • c++学习之继承

    继承的优点 gt 减少重复代码 class A public B A类称为子类或派生类 B类称为父类或者基类 派生类中的成员 包含两大部分 一类是从基类继承过来的 一类是自己增加的成员 从基类继承过来的表现为共性 而新增的成员表现了个性 代
  • Mysql压力测试(sysbench)

    目录 配置项目环境 参考 采用sysbench压测mysql详解 dream21st的博客 CSDN博客 实验步骤 1 安装sysbench工具 2 在master上创建用户和库 配置用户的权限可以使他可以访问库 Mysql的主从复制 3
  • Java开发工具Idea Revert操作

    Revert是撤销操作 类似于Ctrl Z 不同的是 Revert是以版本为单位 撤销整个版本 可以这样理解Revert操作 假如有V1 V2 V3 V4 V5五个版本 Revert撤销V3版本 实际上就是合并V2版本和V5版本 并对V2版
  • Firefox如何快速关闭网页

    问题You 火狐浏览器如何通过鼠标滑动 快速关闭窗口 火狐浏览器可以通过安装扩展程序来实现通过鼠标滑动快速关闭窗口的功能 以下是具体步骤 打开火狐浏览器 在地址栏中输入 about addons 并回车 在左侧菜单中选择 扩展 然后在右侧搜
  • iOS中.obj、.usdz、.dae和.scn格式之间的转化(思路清晰版)

    作者最近在写项目的过程中遇到了一些3d模型格式问题 故写下这篇文章记录一下解决问题的过程 示例 如果我们想用SceneKit库来实现在默认背景中展示一个3D模型 大致可以这样写代码 var sceneView SCNView var sce
  • 围圈数数淘汰游戏

    在围圈游戏中 规则是从某个数同时开始逆时针和顺时针走一定步长 淘汰对应索引的人员 则有两种情况可能顺逆时针轮到同一个人或许人不同 可以通过一个函数确定每走一步数数的索引值 用一个数组表示每个人是否out 的标志位 初始数组每个值为1 out
  • 编写表格树GridTree过程遇到的问题

    项目中用到不少的树和表格 但是要用到表格树的地方不是很多 但是有时候需要的时候却不好找到 所以就在闲暇的时候自己找了一下 结果发现了很简单的 但是不满足项目的需求 于是就看懂了别人的东西之后 再结合自己的理解 干脆就做一个表格树好了 从写下
  • Angular 6 安装到使用

    TOC 前端 Angular 6 安装到使用 1 下载nodejs 并安装到本地 配置好环境变量 访问nodejs的官方网站的downdolad 网址 https nodejs org en download npm v 查看是否安装成功
  • 强大的jQuery图表插件库Highcharts支持线性图、饼状图、柱状图、区域图、气泡图

    Highcharts是一个纯JavaScript编写的jQuery图表插件库 Highcharts提供了简单的方式为您的网站或项目添加动态图表 Highcharts支持线性图 饼状图 柱状图 区域图 气泡图等近20种图表类型 下载地址 ht
  • mybatis(19)——choose标签,when标签和otherwise标签

    代码
  • JMeter简单使用

    一 下载安装 1 在官网下载或者在 share 192 168 1 201 share 开发工具 java apache jmeter 5 5 zip 2 解压 执行文件在bin目录中 二 常用测试组件 1 线程组 线程组是JMeter 中
  • 服务配置宝塔面板搭建环境及部署项目

    服务配置宝塔面板搭建环境及部署项目 1 登录你所购买阿里云服务器的账号 2 点击控制台 云服务器ecs 3 开通安全组开启端口 把需要访问的端口进行配置 选入方向 如 6379 8080 3306 80 21 22 443 4 获取服务器公
  • FOC和SVPWM的C语言代码实现   

    FOC和SVPWM的C语言代码实现 SVPWM的原理讲解在这儿 https blog csdn net qlexcel article details 74787619 comments 现在开始分析C语言的代码 代码建议复制到notepa
  • 【UE4】DataTable - 数据表

    本文使用 UE 4 26 引擎自带 ARPG 项目 从代码和编辑器两个方面记录一下 UE4 中的 DataTable 也就是数据表的用法 一 DataTable 是什么 DataTable 就是数据表 以下简称 DT 也就是二维的 M 行