UE4/5中DataTable数据表的使用

本文介绍了如何在UnrealEngine(UE)中使用DataTable进行配置数据管理。通过创建自定义结构体定义数据格式,然后在蓝图中访问和操作DataTable,包括获取行名、数据以及导出导入数据。同时,展示了在C++中直接操作DataTable的简便方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在UE中经常要对配置数据进行编辑,用好UE自己的DataTable自然对日常使用有所帮助。

1.蓝图使用流程

1.1 DataTable创建

使用数据表首先得创建自定义结构体,这样才好定义每一行的格式,例如这里创建如下:
在这里插入图片描述
然后右键选择创建DataTable,对应结构体选择之前创建的:
在这里插入图片描述

1.2 DataTable访问

接下里需要在蓝图中访问DataTable获取对应数据,可以使用Get Data Table Row Names节点获取每一行的名称,用Get Data Table Row节点将结构体Break出来使用:
在这里插入图片描述
此外还有一个节点Get Data Table Column as String,可以一次性提取所有列的数据,特殊情况下可以使用:
在这里插入图片描述

1.3 DataTable导出与导入

我们还可以通过DataTable的导出功能,将数据导出成csv读入到Excel中进行编辑:
在这里插入图片描述

然后点击Reimport导入:
在这里插入图片描述

2.C++使用流程

如果使用C++类直接创建DataTable会更方便一些,不需要创建一次Struct了,代码如下:

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Engine/DataTable.h"
#include "MyDataTableInfo.generated.h"

USTRUCT()
struct FMyDataTableInfo : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

public:
	UPROPERTY(EditAnywhere)
	int Identifier;

	UPROPERTY(EditAnywhere)
	AActor* TemplateActor;
};
### UE5 中动态数据表输入数据的实现方法 在 Unreal Engine 5 (UE5) 的开发过程中,`DataTable` 是一种非常重要的工具,用于存储和管理游戏中的配置数据。然而,默认情况下,Unreal 提供的功能仅限于静态读取 `DataTable` 数据,而无法直接支持运行时的数据修改或新增。如果需要实现在运行时向 `DataTable` 动态输入数据,则可以通过扩展 C++ 或蓝图的方式完成。 以下是关于如何在 UE5 中实现动态数据表输入的具体方式: #### 方法概述 由于默认 API 对 `DataTable` 编辑的支持有限[^2],开发者通常需要通过自定义 C++ 函数来增强其功能。这些函数可以允许在编辑器模式下或者运行时对 `DataTable` 进行动态写入操作。 --- #### 自定义 C++ 类实现动态写入 1. **创建结构体** 首先,需定义一个与目标 `DataTable` 关联的结构体。该结构体会作为 `DataTable` 行记录的基础模板。 ```cpp USTRUCT() struct FMyDataStruct : public FTableRowBase { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Custom Data") FString Name; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Custom Data") int32 Value; }; ``` 2. **编写辅助函数** 创建一个新的 C++ 辅助类,提供针对 `UDataTable` 的增删改查接口。例如,以下是一个简单的动态写入函数示例: ```cpp void AddRowToDataTable(UDataTable* DataTable, FName RowName, const FMyDataStruct& NewDataRow) { if (!DataTable || !ensure(DataTable->GetRowMap().Contains(RowName))) { DataTable->AddRow<FMyDataStruct>(RowName, NewDataRow); } } ``` 3. **保存更改至磁盘** 修改后的 `DataTable` 不会自动保存到文件中,因此需要手动调用保存逻辑。这一步骤非常重要,尤其是在编辑器环境下工作时。 ```cpp bool SaveDataTable(UDataTable* DataTable, const FString& FilePath) { if (!DataTable) return false; UPackage* Package = DataTable->GetOutermost(); if (Package && Package->IsDirty()) { return UPackage::SavePackage(Package, DataTable, RF_Public | RF_Standalone, *FilePath, GError, nullptr, true, true, SAVE_NoError); } return false; } ``` 4. **集成到蓝图** 将上述 C++ 函数封装成可供蓝图使用的节点。这样可以在蓝图环境中轻松调用它们。 --- #### 考虑事项 需要注意的是,部分涉及 `DataTable` 编辑的操作可能受到 WITH_EDITOR 宏保护,这意味着某些功能只会在编辑器模式下可用。对于打包发布的游戏版本,建议重新设计架构以避免依赖此类受限行为。 另外,当处理大量实时更新需求时,应考虑性能优化策略,比如批量提交变更而非逐条执行。 --- #### 使用场景举例 假设正在构建一款 RPG 游戏,其中角色技能由 `DataTable` 控制。此时可通过以上机制让玩家解锁新能力并即时反映到游戏中去。 ```python # 假设 Python 替代伪代码表示蓝图逻辑 def UnlockNewSkill(PlayerID, SkillName, SkillValue): DataRow = {"Name": SkillName, "Value": SkillValue} AddRowToDataTable(SkillDataTable, PlayerID, DataRow) SaveDataTable(SkillDataTable, "/Game/Data/Skills.dt") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值