Unreal DataTable使用

目的:在多个地方使用同一份结构体配置

C++定义结构体

cpp 复制代码
USTRUCT(BlueprintType)
struct FXXX : public FTableRowBase
{
	GENERATED_BODY()
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XXX")
	float XXX;
}

注意:

  • 类的元数据加上 BlueprintType
  • 继承 FTableRowBase
  • 需要编辑的参数加上 UPROPERTY 标签
  • 参数的元数据加上EditAnywhere, BlueprintReadWrite
  • Category 不能多层,例如 "A|B"

蓝图配置

新建DataTable:

选择你的结构体类型:

PS:选中某一行后直接F2就可以改名字了

蓝图使用

C++使用

内部存了从Name到结构体指针的Map,可以直接从Map拿完整的结构体

cpp 复制代码
class UDataTable
	: public UObject
{
	TMap<FName, uint8*>		RowMap;
	virtual const TMap<FName, uint8*>& GetRowMap() const { return RowMap; }
	virtual const TMap<FName, uint8*>& GetRowMap() { return RowMap; }
}

蓝图的实现也是类似,在创建的时候选的类型信息,会被保存下来,蓝图就根据这个类型信息,调用UScriptStruct::CopyScriptStruct,获取一份数据的复制出来。

cpp 复制代码
bool UDataTableFunctionLibrary::Generic_GetDataTableRowFromName(const UDataTable* Table, FName RowName, void* OutRowPtr)
{
	bool bFoundRow = false;

	if (OutRowPtr && Table)
	{
		void* RowPtr = Table->FindRowUnchecked(RowName);

		if (RowPtr != nullptr)
		{
			const UScriptStruct* StructType = Table->GetRowStruct();

			if (StructType != nullptr)
			{
				StructType->CopyScriptStruct(OutRowPtr, RowPtr);
				bFoundRow = true;
			}
		}
	}

	return bFoundRow;
}

也可以使用 GetAllRows 和 FindRow 函数,ContextString 给空就好了

相关推荐
2301_780669861 分钟前
GUI编程(常用组件、事件、事件常见写法)
java
RisunJan4 分钟前
Linux命令-htpasswd命令(创建和管理用于 HTTP 基本认证(Basic Authentication)的密码文件)
linux·运维·http
brevity_souls5 分钟前
Java 中 String、StringBuffer 和 StringBuilder
java·开发语言
我可以将你更新哟6 分钟前
在Ubuntu 22.04上安装C++编译工具
linux·c++·ubuntu
ss2738 分钟前
类的线程安全:多线程编程-银行转账系统:如果两个线程同时修改同一个账户余额,没有适当的保护机制,会发生什么?
java·开发语言·数据库
郑泰科技8 分钟前
windows下启动hbase的步骤
数据库·windows·hbase
阿拉伯柠檬15 分钟前
传输层协议TCP(一)
linux·网络·网络协议·tcp/ip·面试
子一!!17 分钟前
MySQL数据库基础操作
数据库·mysql·oracle
再睡一夏就好22 分钟前
LInux线程池实战:单例模式设计与多线程安全解析
linux·运维·服务器·开发语言·javascript·c++·ecmascript
一只叫煤球的猫23 分钟前
并行不等于更快:CompletableFuture 让你更慢的 5 个姿势
java·后端·性能优化