UE 数据表 DataTable

当项目中数据量比较大的时候,我们就可以使用到数据表来存储数据。

创建数据表

创建数据表之前,我们需要先定义数据表的结构,可以通过 C++ 类和蓝图类来定义数据表的结构。

C++ 类定义表结构

想要在 C++ 中使用数据表,我们首先在 C++ 中建立一个继承自FTableRowBase的结构体FMyTableTest

#pragma once

#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "MyTableTest.generated.h"

USTRUCT()
struct FMyTableTest : public FTableRowBase
{
    GENERATED_USTRUCT_BODY()
    
public:
    
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tabel")
    FString Name;
    
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tabel")
    int32 Blood;
    
    
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tabel")
    UAnimMontage* StartMontage;
    
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tabel")
    class USoundCue* Sound;
    
    
    FMyTableTest(FString InName = "Undifine",
                 int32 InBlood = 100,
                 UAnimMontage *InStartMontage = nil,
                 USoundCue* InSound = nil): Name(InName), Blood(InBlood), StartMontage(InStartMontage), Sound(InSound) {}    
};

注意:

  • 需要引入头文件:#include"Engine/Datatable.h"
  • FMyTableTest 的类型为 struct

然后,在引擎中创建我们的数据表(Miscellaneous -> DataTable)

选中之后,我们需要选择行结构(Row Structure),在下拉框中,选中我们刚才在 C++ 中创建的接口体FMyTableTest

在这里插入图片描述

选择创建,然后双击打开,可以像表中添加元素。

在这里插入图片描述

注意:DataTable 中,除了有 FMyTableTest定义的属性外,还有一列行名称(RowName)。

蓝图类定义表结构

也可以通过类图结构定义数据表结构。首先创建一个蓝图结构体:MyStruct_BP

在这里插入图片描述

添加结构体的变量、数据类型。也可以调整变量的顺序,变量的顺序会影响数据表的排序:靠上的变量会在数据表中靠左显示。

在这里插入图片描述

在默认值页面,设置各个属性的默认值。

在这里插入图片描述

用相同的方式创建数据表(DataTable),行结构选择创建的蓝图结构体即可。

另外,在数据表格细节(Data Table Details)->行结构体(Row Structure)中,可以快速的定位到对应的蓝图类。

读取收据表

当准备好数据表的数据之后,在代码中可以直接通过资源引用加载 DataTable。首先在 DataTable 上右键->复制引用,获取引用路径:DataTable'/Game/NewDataTable.NewDataTable',再根据引用获取到数据表。

// 根据引用获取
UDataTable* const DataTable = LoadObject<UDataTable>(nullptr, TEXT("DataTable'/Game/NewDataTable.NewDataTable'"));

获取数据

通过 DataTable 的 FindRow 方法根据 RowName 获取行数据:

// 根据 RowName 获取行数据
static const FString ContextString(TEXT("Find FMyTableTest"));
FMyTableTest* Data = DataTable->FindRow<FMyTableTest>(TEXT("NewRow"), ContextString, true);
if (Data)
{
    Print_T(TEXT("NewRow Data:\n"));
    Print_T(TEXT("Name:" + Data->Name + ", Blood:") + FString::FromInt(Data->Blood));
}

void Print_T(const FString& Msg, float Time = 3, FColor Color = FColor::Red)
{
    if (GEngine)
    {
        GEngine->AddOnScreenDebugMessage(-1, Time, Color, Msg);
    }
}

FindRow 的定义如下:

/** Function to find the row of a table given its name. */
template <class T>
T* FindRow(FName RowName, const TCHAR* ContextString, bool bWarnIfRowMissing = true) const;

参数如下:

  • RowName:行名
  • ContextString:上下文,用于打印信息,可以传入方法名等信息。
  • bWarnIfRowMissing:行缺失时,是否打印警告信息。

新增数据

通过 AddRow 方法新增数据:

// 新增行数据
FMyTableTest NewData("MyName", 100);
DataTable->AddRow(TEXT("MyInfo"), NewData);

参考

### Unreal Engine 中的数据表输入方法 在 Unreal Engine (UE) 中,数据表DataTable)是一种用于存储结构化数据的强大工具。它允许开发者以表格形式定义和管理大量静态或动态数据,并可以在运行时轻松访问这些数据。以下是关于如何向 UE数据表中输入数据的方法。 #### 1. 创建 DataTable 资源 要使用数据表,首先需要创建一个新的 `DataTable` 文件资源。这可以通过右键单击内容浏览器中的任意位置并选择 **Miscellaneous -> Data Table** 来完成[^1]。接着指定该数据表使用的行结构体类型(Row Struct),这是决定每一行数据字段的重要部分。 #### 2. 定义 Row 结构体 为了使数据表能够保存特定类型的对象属性集合,在创建数据表之前或者之后都需要先定义好对应的行结构体(Struct)。这个过程涉及编辑器内的 Blueprint 或者通过 C++ 编写自定义的 USTRUCT() 类型来满足需求[^3]。 例如,如果希望记录角色的基础信息,则可以建立如下所示的一个简单结构: ```cpp USTRUCT() struct FCharacterInfo : publicTableRowBase { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Character Info") FString CharacterName; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Character Info") int32 HealthPoints; }; ``` 此代码片段展示了一个名为 `FCharacterInfo` 的新结构体声明及其两个成员变量——字符串名称 (`CharacterName`) 和整数生命值 (`HealthPoints`) 。 #### 3. 使用 CSV 导入外部数据到 DataTable 除了手动填写外,还可以利用逗号分隔值文件(Comma-Separated Values File),即CSV文档的形式快速填充大数据量至已存在的DataTables当中去。具体操作流程为准备一份符合目标DataTable设定规格的标准格式化的csv文本档;随后回到虚幻引擎内部选中对应的目标DataTable资产项,“Fill from CSV”按钮会激活可用状态点击执行即可自动解析导入其中的内容进去[^2]。 注意:确保CSV的第一列标题匹配所关联的Row Structure里的各个字段名顺序一致才能成功映射正确无误地载入预期数值上去哦! #### 4. 动态修改/新增条目于Runtime期间 对于某些特殊应用场景下可能还需要支持实时更新调整甚至扩充现有的预设好的static data tables contents list size length capacity等等情况的话,则需要用到专门针对此类情形而设计出来的API函数调用来达成目的啦!比如借助AddRow()方法就可以很方便地做到这一点咯~不过记得提前确认当前实例是否具备可变权限才行哈~ --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值