写了许多期关于GAS的文章,突然想到,实践的项目中,维护许多的蓝图GE会很费事,策划往往会更偏好于运用Excel,所以想着是不是能够写一个东西,将Excel中的GE数据导出然后生成相对应的蓝图GE类,作用如下图所示。相关代码仅仅开端完成了构想,仅仅供给一个可行的思路。相似的,这个功用也能够用于GA,能够将技术的特点装备转移到Excel中去装备,比如技术范围,技术作用等等。

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

Excel中的GE数据

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

导出的蓝图GE

一边看比赛一边写的文章,woc,bin!

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

确认了需求今后,首要剖析一下,完成需求所需求的功用。

  1. 在编辑器中,咱们会用DT去维护GE表,DT能够经过Json进行导入,那么需求完成功用:将excel转为UE的DataTable所需的Json数据,这个部分我会运用python作为脚本代码完成。
  2. 编辑器能够写Editor Utility代码,在其间完成功用将Json导入填充DataTable数据,然后遍历DT,根据表数据创立和更新GE类Asset
  3. 完成创立蓝图财物的代码,即编辑器中的Asset
  4. GE类Asset创立今后,完成功用能够读取DT装备的数据,更新GE类的数据

直接展现一下最终的作用,根据表中数据,创立了对应的GE_Test类Asset,并根据表中数据更新了类的特点,包含AssetTags,Duration和Modifiers等

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

创立Asset财物

接下来是代码完成,首要越过一,两步,从第三步开端,如何经过C++代码创立指定类的Asset财物,即咱们在蓝图编辑器里看到的后缀为.uasset的东东

创立Editor插件

因为相关代码只在编辑器中运用,不会打包到development或者shipping包中,因此就不写在Source代码中了,首要在项目代码中创立一个新的module,命名随意,我这儿叫AnnaEditor,作为寄存编辑器代码的地方

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

找到对应的uproject文件,将Type改为Editor

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

创立Library

创立BlueprintFunctionLibrary的派生类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

然后创立函数CreateBlueprint,功用是在指定的方位创立指定类的派生类uasset,函数的中心代码是调用引擎代码FKismetEditorUtilities::CreateBlueprint,作用是创立Blueprint类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

代码完成

  1. 判别输入的途径是否现已存在object,假如存在则报错

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 调用KismetEditorUtilities函数库中的函数CanCreateBlueprintOfClass,判别是否能够根据输入的ParentClass生成蓝图类,判别的条件包含:Class是否有用、Class是否能够派生蓝图类等

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 创立Package,包的概念比较笼统,我个人的理解是引擎内的任何资源(object)都是一个package,以共同的格局,按二进制的方式进行存储,读取今后再转为Class, Texture, Material等引擎资源,而存储的方式便是经过package。(假如答复的不对,请大佬指导,这一块刚刚开端学习)

篮子悠悠:UE4 C++根底 – 资源常见名词解释153 赞同 2 谈论文章

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 输入ParentClass获取对应的蓝图类,和生成的蓝图类。C++类创立蓝图派生类为什么还需求生成一个蓝图类,这一块我了解的并不深入,假如有大佬能够帮我解答一下,非常感谢。

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 创立蓝图财物

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 注册并保存蓝图财物

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 测验,首要创立EBP,命名为EBP_GenGE

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

重写Run函数,调用刚才完成的CreateBlueprint函数

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

右键创立的EBP_GenGE,在最上面能够看到RunEditorUtilityBlueprint,点击今后会调用run函数

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

点击今后,就能够看到编辑器在指定的方位创立了GameplayAbility的类,命名为Test的蓝图财物,创立成功!

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

读取DT数据写入GE类

现在咱们现已能够创立蓝图类了,因此现已能够在指定方位创立GE类了,那么接下来需求完成的便是,能够根据表中的数据,修改GE类的参数

  1. 创立DT行结构体的派生类,命名为FAnnaEditorGenGameplayEffect,其间记录了决定GE类特点所需求的数据,我这儿仅仅写了一部分或许能够用到的数据作为参阅。ParentClass为创立的GE的父类,DurationPolicy和Duration应该不需求解释,决定了GE的持续时间规矩,AssetTags也不言自明,ModifyAttributes为GE的Modifiers中需求修改的数据是什么

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 创立函数CreateOrUpdateGEBlueprint

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 完成如下,榜首步判别BlueprintPath的方位是否现已存在GE类,假如不存在,则需求调用上一步完成的CreateBlueprint函数生成蓝图财物

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 调用CreateBlueprint创立GE类财物

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 判别创立的GE类是否有用,假如无效则报错

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 接下来开端给GE类赋值,首要赋值Duration,假如GE的持续时间类型为HasDuration,则写入持续时间

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 给GE类增加对应的AssetTags,从5.3开端,GE的特点开端由GEComponent来决定,所以假如要给GE增加Asset Tags,首要需求增加对应的AssetTagsGameplayEffectComponent。其它相似GrantAbility,Imunity等功用,也需求经过增加GEComponent去完成

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 增加GE所需求修改的特点

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

这儿的ConvertStringToAttribute是为了将String转为对应的GameplayAttribute

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

  1. 标记GE类为Dirty,回来创立并更新的GE类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

读取DT创立GE

在前面咱们现已完成了3,4步的功用,现已能够根据GE Gen Data在蓝图中创立GE类,并更新GE的特点和作用,那么这一步的目标是读取GE DT,遍历悉数的行,依次读取GE Gen Data然后在编辑器蓝图中生成GE类

首要创立RowStructure为FAnnaEditorGenGameplayEffect的DataTable,命名为EDT_GameplayEffect

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

打开在前面创立的Editor Utility Blueprint-EBP_GenGE

创立函数Generate Gameplay Effects,首要获取表中悉数RowNames,再依次读取对应的表数据的结构体

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

接下来生成GE的途径,途径由两个部分组成,榜首个部分为GE的文件夹途径EffectPath,第二个部分为GE类名,组合在一起便是最终的Path

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

获取生成需求生成的GE类的父类,默认为项目的GE基类,我这儿为AnnaGameplayEffect,不过这一步似乎能够移动到C++中去做

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

调用在第二步完成的函数CreateOrUpdateGEBlueprint函数,创立并更新GE类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

蓝图代码展现

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

最终给创立的DT中增加一些数据,我自己随便写了两个测验

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

Run调用GenerateGameplayEffects

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

跑一下,就能够看到在指定的途径生成了GE类,Perfect!

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

做到这一步,现已能够给供给一个能够维护的表东西了,在编辑器中能够经过装备DT来导出GE,但是DataTable依旧是一个二进制的文件,没有办法合并,一起DT的功用究竟不如Excel多,有时候没有办法满足策划的需求,用起来没有有着足够沉积的Excel丝滑。为此,我最终还会试着写一个Excel导表东西,将Excel生成能够导入UE的Json文件。

Excel导表东西

导表东西我是试着用python来写的,python写起来简略,对json和excel的读写支撑都很完善,我大概花了一个晚上研究一下就能能够大致的完成了。代码需求用到pandas库,python环境的安装和装备网上一搜就有许多,我这儿就不复述了,这儿我只把代码贴出来,仅供参阅。

榜首步,咱们首要看看DT导出的Json是长啥样的。有了对应的Json文件,咱们就依样画葫芦照着写,让导表生成的Json和UE导出来的格局相同,就能够将导出文件再导入到UE当中了。

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

然后看一看我的Excel表格,其间榜首行为特点名,对应了Json表中的Key键值,即紫色的部分。第二行为数据类型,在根底类型外,我额定支撑了list和map。从第三行开端便是GE类的特点了。

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

首要创立函数item_excel_to_json,它的作用是将Excel单元格的数据转为Json对应的数据,下图所示,Excel中榜首行为特点名,第二行为数据类型,在这儿我支撑了list和map,str,int,float,tag等类型,第三行为数据,关于list和map来说,逗号“,”为分隔符。

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

函数的输入分别代表了数据类型和excel中的单元格数据,数据类型是Excel表中第二行绿色的部分

首要考虑list和map两种情况,递归调用item_excel_to_json,依次读取单元格内的子数据并转化为对应的类型

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

关于枚举类,UE导出的Json如下,仅仅一个简略的string,但问题是,如何确保在excel中输入的数据是对的呢?

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

我运用了一个笨方法,创立一个Enum Map,维护表中需求用到的悉数枚举数据

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

假如data_type在枚举字典中存在,那么首要判别excel单元格的数据是否存在,假如不存在则报错,进行一个查看

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

接下来考虑str,float和int的情况

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

最终考虑到tag的特殊情况,让生成的json和导出的共同。

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

关于UE来说,导出的结构体是相似下面的姿态,是一个字典,字典的key为property name,value为property value,其实便是一个嵌套的结构,理论上结构体的导出函数也能够用递归的方法获取,但现在我仅仅写一个最简略的版本,之后有时间再考虑去进行优化吧。

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

最终完成读Excel导出Json的代码,代码应该蛮简略的,便是一行行遍历excel单元格的数据,将其转为json并增加到json_list中,最终将json_list写入json文件

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

运转一下python代码,打开查看生成的json文件,和导出的一模相同,完美

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

写一个批处理文件能够运转导表代码

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

最终从头打开编辑器的EBP蓝图,在run后调用函数FillDataTableFromJsonFile,它的作用是导入json文件填充DT。填充完数据今后就能够调用生成蓝图GE的代码,至此,神功大成!

UE5-GAS:读取Excel数据在蓝图创立并更新GE类

最终作用展现

假如感兴趣的人多,我能够考虑抽时间将相关代码写成一个插件

UE5-GAS:读取Excel数据在蓝图创立并更新GE类