当项目中数据量比较大的时分,咱们就能够运用到数据表来存储数据。

创立数据表

创立数据表之前,咱们需求先界说数据表的结构,能够通过 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)

UE 数据表 DataTable

选中之后,咱们需求挑选行结构(Row Structure),在下拉框中,选中咱们刚才在 C++ 中创立的接口体FMyTableTest

UE 数据表 DataTable

挑选创立,然后双击翻开,能够像表中增加元素。

UE 数据表 DataTable

留意:DataTable 中,除了有 FMyTableTest界说的特点外,还有一列行名称(RowName)。

蓝图类界说表结构

也能够通过类图结构界说数据表结构。首先创立一个蓝图结构体:MyStruct_BP

UE 数据表 DataTable

增加结构体的变量、数据类型。也能够调整变量的次序,变量的次序会影响数据表的排序:靠上的变量会在数据表中靠左显现。

UE 数据表 DataTable

在默认值页面,设置各个特点的默认值。

UE 数据表 DataTable

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

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

UE 数据表 DataTable

读取收据

当准备好数据表的数据之后,在代码中能够直接通过资源引证加载 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);

参阅

  • UE4中运用数据表DataTable(C++版本)
  • 【UE4】DataTable – 数据表