欢迎光临散文网 会员登陆 & 注册

UE4 使用蓝图工具依靠DataTable批量创建和修改DataAsset (超实用)

2023-01-27 08:01 作者:末日时你吃了吗  | 我要投稿

前言:

个人不是很喜欢在游戏运行期间读取数据表,也不太喜欢使用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选项。运行我们写的方法即可。

而第二步设置类的作用在于  仅右键选中该类的文件时 才会出现额外选项,即相当于过滤了。

结束语:

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


UE4 使用蓝图工具依靠DataTable批量创建和修改DataAsset (超实用)的评论 (共 条)

分享到微博请遵守国家法律