UE4 使用藍圖工具依靠DataTable批量創(chuàng)建和修改DataAsset (超實用)
前言:
個人不是很喜歡在游戲運行期間讀取數(shù)據(jù)表,也不太喜歡使用DataTable C++ API。大部分情況下使用的都是DataAsset,通過直接訪問DataAsset 來獲得各種數(shù)據(jù)展示、配置信息。
即僅將DataTable作為能夠方便快速直觀地 管理與修改數(shù)據(jù)的手段,將DataAsset作為數(shù)據(jù)獲取的來源。
本文分為兩個部分,分別為批量創(chuàng)建與批量修改。需要提前注意的是,兩者使用的藍圖工具所繼承的父類是不一樣的。
Part?Ⅰ. 批量創(chuàng)建
第一步:用C++寫一個DataAsset創(chuàng)建方法。該操作貌似無法通過藍圖實現(xiàn)。
· ItemClass 所需要創(chuàng)建的類文件,PackagePath 所創(chuàng)建的目錄,AssetName?所創(chuàng)建的文件名稱
·? 該方法是 繼承了UBlueprintFunctionLibrary的類中 ,所定義的靜態(tài)方法。故可以直接通過藍圖調(diào)用。
·? 這里的UDreamItem 是繼承了UPrimaryDataAsset的。
第二步:創(chuàng)建藍圖工具

· 這里的父類我們選擇 EditorUtilityObject
第三步:重寫Run事件。

大致步驟如下:
1、獲得 DataTable中的所有行名稱,
2、遍歷 行名稱,每次遍歷都 通過行名稱?讀取?表行數(shù)據(jù),并且調(diào)用我們之前寫的創(chuàng)建DataAsset的方法。
3、將創(chuàng)建出來的DataAsset(即方法返回值) 強轉(zhuǎn)成我們期望的類型,那之后根據(jù)讀取到的表行數(shù)據(jù),設置DataAsset中相應的數(shù)據(jù)。
注意事項:
1、路徑名稱必須以"/"開頭,
此外,假如你想要將DataAsset 創(chuàng)建在名為 A的文件夾中,路徑的末尾應當是 "A/任意字符 "

2023年01月30日補充:
被劃掉部分的說法是完全錯誤的。路徑名稱正確表示形式應當為:
[ /目錄名稱/文件名.文件名]
區(qū)別于原先的?[ 目錄名稱/任意字符.文件名]
以位于/Game/Blueprint文件夾下的,類型為DreamItem、名稱為ItemD的資源為例,當右鍵CopyReference時,復制得到的引用路徑為:
“DreamItem'/Game/Blueprint/ItemD.ItemD'”
故我們傳入的正確路徑應當是:[包名+文件名] 的形式。

這樣做的好處是,獲取了有效路徑后,我們可以直接使用?DoesAssetExist 和LoadAsset這兩個節(jié)點,前者能夠根據(jù)路徑判斷資源是否存在,后者能夠?qū)⒙窂綄馁Y源加載成UObject。
CreateNewAsset 升級版如下:

該方法的作用如下:
如果資源已經(jīng)存在,將其加載出來并修改。
如果不存在,則將其創(chuàng)建出來后再修改。
該方法可以直接用C++實現(xiàn),只是要額外引入藍圖編輯模塊 ← 太麻煩了還不如直接用藍圖實現(xiàn)...
02.03 再度補充:
對于所有通過路徑直接加載出來的AssetData,應當對其進行MarkDirty操作,以方便后續(xù)進行批量保存操作。示例:

2、DataAsset里面的文本數(shù)據(jù)往往會以 FText的形式存儲,當我們將數(shù)據(jù)表的中FString 直接為其賦值的時候,該值的末尾會出現(xiàn)感嘆號提示,原因在于寫入的FText未被格式化,屬于“本地方言”。我們可以通過 FormatText?的方式將其格式化。如圖所示。
3、DataAsset中的屬性應當設置為?BlueprintReadWrite,不然改個寂寞。
FText的優(yōu)點在于可以被格式化,可以被直接展示至UI。
FString的優(yōu)點在于易于修改,以完成字符的截取、拼接、替換等操作。

第四步:右鍵創(chuàng)建的藍圖工具運行即可。記得保存。
由于我們是在游戲外手動操作的,無需擔心性能問題,邏輯寫得再復雜也沒有關系。
Part?Ⅱ. 批量修改
注:我沒找到可以直接加載PrimaryAssetID的方式,使用AsyncLoadPrimaryAsset的話 需要傳入一個WorldContextObject,我們沒辦法整一個出來。故這里采用了AssetActionUtility的方式。

2023年01月30日補充:
直接用C++在FunctionLib中 寫一個加載方法就行了。示例:
此時我們直接使用 GetPrimaryAssetIdList的方式 批量獲取,然后逐一進行加載。如圖所示。

兩種方法怎么方便怎么來吧??=? =

第一步:創(chuàng)建藍圖工具,與上面不同的是,我們選擇的父類是AssetActionUtility。
第二步(可選):重寫GetSupportedClass方法

· 這里傳入的類就是我們要操作的類名。該方法的用處后面會解釋。
第三步:創(chuàng)建讀取數(shù)據(jù)的方法,我這里方法名稱是 LoadDescription。

大致步驟如下:
1、通過GetSelectedAssets獲取被我們選中的數(shù)據(jù)
2、遍歷,將所獲得的UObject強轉(zhuǎn)為我們需要的類型。
3、后續(xù)的處理邏輯和前面基本一樣,都是讀表然后改數(shù)據(jù)。就不贅述了。
第四步:
在內(nèi)容瀏覽器中批量選中我們需要的資產(chǎn),右鍵,會發(fā)現(xiàn)多出了一個ScriptedAction選項。運行我們寫的方法即可。
而第二步設置類的作用在于 ?僅右鍵選中該類的文件時 才會出現(xiàn)額外選項,即相當于過濾了。

結(jié)束語:
踩坑沒什么,但一個坑前仆后繼地有人踩多少有些愚蠢了,這也是我寫這篇筆記的原因,也希望大家能自己寫一些筆記。寫得多了,后續(xù)的人凡事遇到問題 就不會只能用 蹩腳的英文在英文搜索引擎中 搜索用英文寫出來的答案了 =? =?