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 给空就好了

相关推荐
沫璃染墨13 分钟前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
写后端的胖头鱼17 分钟前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
专业程序开发源21 分钟前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户0942485680323 分钟前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu25 分钟前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
路远的数据库笔记33 分钟前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba
樱花落木兰35 分钟前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
深念Y40 分钟前
rime-雾凇拼音-配置记录
linux·junit·软件·拼音·kde
HAHAXX842 分钟前
电商RPA批量上架通用方案:一套流程如何同时跑通拼多多、抖店、淘宝和跨境平台
java·运维·rpa
\光辉岁月/1 小时前
3.java运算符
java·开发语言