UE4 使用蓝图工具依靠DataTable批量创建和修改DataAsset (超实用)
前言:
个人不是很喜欢在游戏运行期间读取数据表,也不太喜欢使用DataTable C++ API。大部分情况下使用的都是DataAsset,通过直接访问DataAsset 来获得各种数据展示、配置信息。
即仅将DataTable作为能够方便快速直观地 管理与修改数据的手段,将DataAsset作为数据获取的来源。
本文分为两个部分,分别为批量创建与批量修改。需要提前注意的是,两者使用的蓝图工具所继承的父类是不一样的。
Part Ⅰ. 批量创建
第一步:用C++写一个DataAsset创建方法。该操作貌似无法通过蓝图实现。
· ItemClass 所需要创建的类文件,PackagePath 所创建的目录,AssetName 所创建的文件名称
· 该方法是 继承了UBlueprintFunctionLibrary的类中 ,所定义的静态方法。故可以直接通过蓝图调用。
· 这里的UDreamItem 是继承了UPrimaryDataAsset的。
第二步:创建蓝图工具

· 这里的父类我们选择 EditorUtilityObject
第三步:重写Run事件。

大致步骤如下:
1、获得 DataTable中的所有行名称,
2、遍历 行名称,每次遍历都 通过行名称 读取 表行数据,并且调用我们之前写的创建DataAsset的方法。
3、将创建出来的DataAsset(即方法返回值) 强转成我们期望的类型,那之后根据读取到的表行数据,设置DataAsset中相应的数据。
注意事项:
1、路径名称必须以"/"开头,
此外,假如你想要将DataAsset 创建在名为 A的文件夹中,路径的末尾应当是 "A/任意字符 "

2023年01月30日补充:
被划掉部分的说法是完全错误的。路径名称正确表示形式应当为:
[ /目录名称/文件名.文件名]
区别于原先的 [ 目录名称/任意字符.文件名]
以位于/Game/Blueprint文件夹下的,类型为DreamItem、名称为ItemD的资源为例,当右键CopyReference时,复制得到的引用路径为:
“DreamItem'/Game/Blueprint/ItemD.ItemD'”
故我们传入的正确路径应当是:[包名+文件名] 的形式。

这样做的好处是,获取了有效路径后,我们可以直接使用 DoesAssetExist 和LoadAsset这两个节点,前者能够根据路径判断资源是否存在,后者能够将路径对应的资源加载成UObject。
CreateNewAsset 升级版如下:

该方法的作用如下:
如果资源已经存在,将其加载出来并修改。
如果不存在,则将其创建出来后再修改。
该方法可以直接用C++实现,只是要额外引入蓝图编辑模块 ← 太麻烦了还不如直接用蓝图实现...
02.03 再度补充:
对于所有通过路径直接加载出来的AssetData,应当对其进行MarkDirty操作,以方便后续进行批量保存操作。示例:

2、DataAsset里面的文本数据往往会以 FText的形式存储,当我们将数据表的中FString 直接为其赋值的时候,该值的末尾会出现感叹号提示,原因在于写入的FText未被格式化,属于“本地方言”。我们可以通过 FormatText 的方式将其格式化。如图所示。
3、DataAsset中的属性应当设置为 BlueprintReadWrite,不然改个寂寞。
FText的优点在于可以被格式化,可以被直接展示至UI。
FString的优点在于易于修改,以完成字符的截取、拼接、替换等操作。

第四步:右键创建的蓝图工具运行即可。记得保存。
由于我们是在游戏外手动操作的,无需担心性能问题,逻辑写得再复杂也没有关系。
Part Ⅱ. 批量修改
注:我没找到可以直接加载PrimaryAssetID的方式,使用AsyncLoadPrimaryAsset的话 需要传入一个WorldContextObject,我们没办法整一个出来。故这里采用了AssetActionUtility的方式。

2023年01月30日补充:
直接用C++在FunctionLib中 写一个加载方法就行了。示例:
此时我们直接使用 GetPrimaryAssetIdList的方式 批量获取,然后逐一进行加载。如图所示。

两种方法怎么方便怎么来吧 = =

第一步:创建蓝图工具,与上面不同的是,我们选择的父类是AssetActionUtility。
第二步(可选):重写GetSupportedClass方法

· 这里传入的类就是我们要操作的类名。该方法的用处后面会解释。
第三步:创建读取数据的方法,我这里方法名称是 LoadDescription。

大致步骤如下:
1、通过GetSelectedAssets获取被我们选中的数据
2、遍历,将所获得的UObject强转为我们需要的类型。
3、后续的处理逻辑和前面基本一样,都是读表然后改数据。就不赘述了。
第四步:
在内容浏览器中批量选中我们需要的资产,右键,会发现多出了一个ScriptedAction选项。运行我们写的方法即可。
而第二步设置类的作用在于 仅右键选中该类的文件时 才会出现额外选项,即相当于过滤了。

结束语:
踩坑没什么,但一个坑前仆后继地有人踩多少有些愚蠢了,这也是我写这篇笔记的原因,也希望大家能自己写一些笔记。写得多了,后续的人凡事遇到问题 就不会只能用 蹩脚的英文在英文搜索引擎中 搜索用英文写出来的答案了 = =

