创建DataTable
在编辑器中创建
在文件夹空白处右击,选择Miscellaneous/DataTable,如图:
使用代码创建
// 创建DataTable实例
UDataTable* MyDataTable = NewObject();
// 创建一个行结构体
UStruct* RowStruct = UStruct::CreateEmpty();
// 添加两个属性到结构体
FStructProperty* Property1 = FStructProperty::Create(RowStruct, TEXT("Property1"), EPropertyFlags::CPF_Edit);
FStructProperty* Property2 = FStructProperty::Create(RowStruct, TEXT("Property2"), EPropertyFlags::CPF_Edit);
// 更新结构体
RowStruct->StaticLink(true);
// 设置行结构体
MyDataTable->RowStruct = RowStruct;
在DataTable中添加行数据
有了DataTable的结构或者类型定义后,接下来您需要添加数据。以下是示例代码:
// 获取DataTable并检查是否有效
UDataTable* MyDataTable = LoadObject(nullptr, TEXT("DataTable'/Game/Data/MyDataTable.MyDataTable'"));
if (MyDataTable)
{
// 创建行数据实例
FMyRowData MyRow;
// 设置行数据
MyRow.Property1 = FString(TEXT("Value"));
MyRow.Property2 = 10;
// 添加行数据
MyDataTable->AddRow(TEXT("RowName"), MyRow);
}
结构体选取
UE中的结构体选取是定义DataTable中行数据的非常常用的方法。结构体选取可以用来设计更复杂的数据结构,比如嵌套结构体。以下是结构体选取的示例:
// 定义一个结构体属性
FStructProperty* StructProperty = CastField(MyDataTable->RowStruct->FindPropertyByName(TEXT("Property1")));
// 获取结构体属性值
FMyRowData MyRowData = MyDataTable->GetRow(TEXT("RowName"));
FString PropertyValue = StructProperty->GetPropertyValue_InContainer(&MyRowData)->ToString();
从CSV文件中导入数据
导入CSV文件到DataTable可以帮您提高生产效率,特别是当数据非常大时。以下是从CSV文件中导入DataTable数据的示例:
// 打开CSV文件
FString FilePath = FString(TEXT("Data/MyData.csv"));
FString FileContent;
FFileHelper::LoadFileToString(FileContent, *FilePath);
// 将CSV文件解析为FDataTableImporterCSV类型
FDataTableImporterCSV DataTableImporterCSV(*FileContent);
// 导入数据到DataTable
MyDataTable->CreateTableFromCSVString(FileContent);
从DataTable导出数据
从DataTable中导出数据可以让您将数据放到一个易于处理的格式中,比如一个文本或者XML文件。以下是从DataTable导出数据的示例:
// 从DataTable中获取行数据
FMyRowData* RowData = MyDataTable->FindRow(TEXT("RowName"), FString(""), true);
// 使用JSON格式序列化行数据并保存到文件
FString JsonString;
FJsonObjectConverter::UStructToJsonObjectString(RowData, JsonString);
FString FilePath = FString(TEXT("Data/MyData.json"));
FFileHelper::SaveStringToFile(JsonString, *FilePath);