IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> UE DataTable - 数据表 -> 正文阅读

[游戏开发]UE DataTable - 数据表

一、DataTable 是什么

????????DataTable 就是数据表,也就是一个二维的 M 行 N 列的矩阵,如下图所示就是一个七行六列的数据表:

程序可以通过策划配置的数据表找到对应关系做相应的逻辑,对策划很友好。


二、在编辑器中使用

1.创建一个结构体

? ? ? ? 首先创建一个结构体,该结构体就是我们要创建的数据表的列数据,然后再在新创建的结构体中添加变量,可以在Default Values页面设置添加数据时的默认值:

2. 创建一个数据表

????????在编辑器中右键,Miscellaneous -> DataTable 即可创建一个 DataTable:

? ? ? ? ?创建数据表的时候,需要选择一个结构体,选择我们刚才新创建的那个结构体即可,这样创建出来的数据表的列就是刚才结构体中的变量:

? ? ? ? ?新创建的数据表默认是空的, 点击 Add 按钮可以添加一个默认行,第一列的Row Name是自动生成的,可以更改其中的数据。添加完成后,点击数据表中的一行,这一行会高亮,且可以在 Row Editor 中修改这一行的值(注意:代表行数的第一列,以及列名称是不能改的)

3. 蓝图中获取数据表中数据

? ? ? ? 可以使用节点GetDataTableRowNames获取数据表中全部行的Row Name:

? ? ? ? 使用节点GetDataTableRow根据Row Name获取该Row Name那一行的数据:

? ? ? ? ?可以这样读取数据表中的数据打印出来:

4. 导入CSV为数据表

?????????在编辑器中右键,导入资源到文件夹,然后选择要导入的CSV文件:

? ? ? ? ?导入的时候也需要选择该数据表所使用的结构体。


三、代码中使用

1. 使用代码创建一个列结构

? ? ? ? 继承FTableRowBase类,需要包含头文件"Engine/DataTable.h",同时由于添加结构体用到USTRUCT,加入了反射系统,还需要包含该文件的.generated.h头文件:

USTRUCT(BlueprintType)
struct FTableRowTest : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

public:
	FTableRowTest(){}

	FTableRowTest(FString InName, int32 InCurrentCount, int32 InMaxNum, float InLifeTime)
		:name(InName)
		, CurrentCount(InCurrentCount)
		, MaxNum(InMaxNum)
		, LifeTime(InLifeTime)
	{
		
	}

	UPROPERTY(EditAnywhere, BlueprintReadOnly, DisplayName = "名字")
	FString name;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, DisplayName = "当前数量")
	int64 CurrentCount = 0;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, DisplayName = "最大数量")
	int64 MaxNum = 100;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, DisplayName = "生命周期")
	float LifeTime = 10.0f;
};

? ? ? ? ?编译过后就可以在创建数据表的时候看到刚才创建的结构体选项了:

2. 通过代码读数据表

? ? ? ? 可以通过FindRow读取某一行的数据:

UDataTable* const UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
if (UserInfoDataTable)
{
	for (FName RowName : UserInfoDataTable->GetRowNames())
	{
		FTableRowTest* TestInfo = UserInfoDataTable->FindRow<FTableRowTest>(RowName, TEXT("name"));
		if (TestInfo)
		{
			UKismetSystemLibrary::PrintString(GetWorld(), TestInfo->name);
		}
	}
}
else
{
	UKismetSystemLibrary::PrintString(GetWorld(), TEXT(" Not Find DataTable!"));
}

? ? ? ? ?可以通过GetRowMap读取数据表中全部数据:

UDataTable* const UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
if (UserInfoDataTable)
{
	for (auto it : UserInfoDataTable->GetRowMap())
	{
		FString RowName = (it.Key).ToString();

		FTableRowTest* TestInfo = (FTableRowTest*)it.Value;

		UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("%s %s"), *RowName, *TestInfo->name));
	}
}

3. 通过代码写数据表

????????在代码中可以直接通过资源路径和名称加载数据表,比如在 Content/TestForDT 目录下的 “MyTestDT”,可以这样加载:

UDataTable* const TestTable = LoadObject<UDataTable>(nullptr, TEXT("/Game/TestForDT/MyTestDT.MyTestDT"));

?????????然后就可以通过?void UDataTable::AddRow(FName RowName, const FTableRowBase& RowData)?来新增行了。比如:

UDataTable* const UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
if (UserInfoDataTable)
{
	FSimpleStruct* UserInfo = new FSimpleStruct();
	UserInfo->name = TEXT("Lily");
	UserInfo->health = 80;
	FName RowName = TEXT("Player3");
	UserInfoDataTable->AddRow(RowName, *UserInfo);
}

4. 导入CSV

  • csv 文件
---,name,health,icon
Player4,"马克","200","Texture2D'/Game/FourEvilDragonsHP/Textures/DragonTheUsurper/BlueHPTex.BlueHPTex'"
Player5,"冉冰","90","Texture2D'/Game/FourEvilDragonsHP/Textures/DragonTheSoulEater/BlueHPTex.BlueHPTex'"
Player6,"墨城","150","None"
  • 填充现有的 DataTable?
UDataTable* const UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
if (UserInfoDataTable)
{
	FString CSVPath = FPaths::ProjectDir() + TEXT("DataDrive/UserInfo.csv");
	CSVPath = FPaths::ConvertRelativePathToFull(CSVPath);
	if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*CSVPath))
	{
		UDataTableFunctionLibrary::FillDataTableFromCSVFile(UserInfoDataTable, CSVPath);
	}
}
  • 生成 UDataTable
UDataTable* const UDataTable* ADataDriveActor::CreateDataTableFromCSV()
{
	FString CSVPath = FPaths::ProjectDir() + TEXT("DataDrive/UserInfo.csv");
	CSVPath = FPaths::ConvertRelativePathToFull(CSVPath);
	if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*CSVPath))
	{
		UKismetSystemLibrary::PrintString(GetWorld(), *CSVPath);
		FString CSVData;
		FFileHelper::LoadFileToString(CSVData, *CSVPath);
		UDataTable* DT_UserInfo = NewObject<UDataTable>(GetTransientPackage(), FName(TEXT("DT_UserInfo2")));
		DT_UserInfo->RowStruct = FSimpleStruct::StaticStruct();
		DT_UserInfo->CreateTableFromCSVString(CSVData);

		return DT_UserInfo;
	}
	return nullptr;
}

?5. 导出 CSV

? ? ? ? 使用GetTableAsCSV():

UDataTable* const UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
if (UserInfoDataTable)
{
	FString CSVString = UserInfoDataTable->GetTableAsCSV();
	FString CSVPath = FPaths::ProjectDir() + TEXT("DataDrive/UserInfo2.csv");
	FFileHelper::SaveStringToFile(CSVString, *CSVPath, FFileHelper::EEncodingOptions::ForceUTF8);
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:59:49  更:2022-03-30 19:03:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 17:57:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码