当项目中数据量比较大的时候,我们就可以使用到数据表来存储数据。
创建数据表之前,我们需要先定义数据表的结构,可以通过 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) {}
};
注意:
然后,在引擎中创建我们的数据表(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;
参数如下:
通过 AddRow 方法新增数据:
// 新增行数据
FMyTableTest NewData("MyName", 100);
DataTable->AddRow(TEXT("MyInfo"), NewData);