ue4 关于创建动态结构体的一点思考

前言:这大半年其实没有怎么更新博客,对于自己的博客其实大部分都是一些基础教学性质的文章,真正探索性质和比较深入的内容其实很多都并没有发表出来,我想以后单独出些教学视频或资料和大家交流

这篇文章是自己写工具时遇到的一个问题,由此而写。看到这篇文章就不用再看其他文章了,因为都没有这方面的资料

 

介绍下目前ue4的静态Struct和DataTable的关系

先看一张excel表导入到ue4的过程:

这是一张excel的数据,其中包含了字段名和数据

在ue4中我们也要创建一个结构体

在结构体中定义好和excel一致的字段和类型

在创建DataTable时选择该结构体,才能确定每一行Row的含义和类型

 

可是这样有什么缺点呢?

如果一个结构体删除一个字段,增加一个字段,那手动改结构体会不会很麻烦?如果有一千张excel表格都要导入到DataTable,岂不是要先定义好一千个结构体,如果哪个结构体有问题,策划要检查该excel对应的struct,岂不是增加工作成本?

因此使用ue4的反射机制,根据策划在excel中定义好的类型,在导入成DataTable时动态生成该结构的struct并生成DataTable,将每一行的数据插入进来,自动迁出提交到svn或者git,岂不美哉?

 

基于ue4反射机制生成的动态struct

我们在excel中的前五行插入元数据,真正的数据从start行开始到end行结束,在前五行的第三行是表示每一列的数据类型,我们在导入到ue4中时需要解析类型并动态创建结构体,为这个结构体添加每一列的类型即可

那么怎么做?怎么做?

我们知道ue4最大的弊端就是木有文档,资料太少,只能看源码,我们来看下ue4中创建一个struct调用的是哪个模块

通过断点发现,在点击structure的一瞬间会调用

在Unreal Engine (UE) 5的C++中,DataTable是一种强大的数据存储机制,它可以动态地管理复杂的数据结构。如果你想动态创建一个指定结构体的DataTable,你可以按照以下步骤操作: 1. 首先,你需要定义你的结构体Structure)。例如,假设有一个名为`MyStruct`的结构体: ```cpp USTRUCT() struct MyClass { GENERATED_BODY() UPROPERTY(EditAnywhere) float ValueA; UPROPERTY(EditAnywhere) int32 ValueB; }; ``` 2. 然后,在你的类中,可以使用`TSharedPtr<FJsonSerializer>`与`FName`来动态创建DataTable: ```cpp void CreateDataTable() { TSharedPtr<FJsonSerializer> Serializer = MakeShareable(new FJsonSerializer()); // 创建DataTable的名字 FName DataTableName = FName("MyData"); // 使用Json序列化的方式动态创建DataTable TArray<TAttribute<FName, FString>> Attributes; Attributes.Add(TAttribute<FName, FString>("ValueA", TEXT("ValueA"))); Attributes.Add(TAttribute<FName, FString>("ValueB", TEXT("ValueB"))); if (!Serializer->TryDeserialize<DataTable>(DataTableName.ToString(), Attributes, *MyDataTable)) { UE_LOG(LogTemp, Warning, TEXT("Failed to create DataTable")); } } ``` 这里,`MyDataTable`是你打算存放这个DataTable的类成员变量。 3. 最后,别忘了注册你的DataTable到游戏全局的数据表系统中,通常在`PostConstruction()`或者`BeginPlay()`函数里: ```cpp void BeginPlay() { Super::BeginPlay(); // 注册你的DataTable RegisterAllComponents(); GetMutableDefault<UObject>()->RegisterDataTable(MyDataTable); } ``` 如果你遇到任何错误或需要进一步帮助,记得检查JSON字符串是否匹配你的结构体,并查看是否有权限在当前上下文下创建DataTable。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值