[UE4] 處理DataTable的Import資料格式轉換
問題
假設我們有一個含有Enum的DataTable定義如下
UENUM()
enum class EAnimalType : int32
{
Chicken,
Duck,
Bird,
};
USTRUCT(BlueprintType)
struct BREAKWORLD_API FAnimalDataRow : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY()
EAnimalType Type;
UPROPERTY()
FString AnimalName;
};
但是原始資料是CSV或是Json檔,此時如果使用UE4的Import工具,int到enum將不會自動轉換而無法取得正確的enum值。
迫於無奈,之前的做法是只能暫時存為int,等到要使用資料時再手動變換。然而這麼做的話編輯器內的DataTable會長這個樣子。
由於我們是以int儲存的,因此無法看到enum的值。當資料多的時候數字會難以辨識,有沒有更好的處理方法呢?
使用 OnPostDataImport 處理資料轉換
結果在引擎程式碼發現了這個函式 ,會在Import結束後被呼叫,可以override這個函式來做資料轉換。實際做的修改如下:
USTRUCT(BlueprintType)
struct BREAKWORLD_API FAnimalDataRow : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY()
EAnimalType Type;
UPROPERTY()
int32 TypeTemp;
UPROPERTY()
FString AnimalName;
virtual void OnPostDataImport(const UDataTable* InDataTable, const FName InRowName, TArray<FString>& OutCollectedImportProblems) override;
};
void FAnimalDataRow::OnPostDataImport(const UDataTable* InDataTable, const FName InRowName, TArray<FString>& OutCollectedImportProblems)
{
Type = static_cast<EAnimalType>(TypeTemp);
}
在實作的函式中將新增的暫時變數int的TypeTemp轉換成enum的Type。實際修改後Import試試看後,雖然Enum有正確轉換,但是出現了錯誤?
原來引擎內設定只要有找不到的Column (Type) 就會顯示這個警告訊息,搜尋了一下警告出現的地方,發現可以使用DataTableImportOptional這個MetaData來表示這個Property是不需要被import的,在import檢查的時候就會被忽略。
對Property使用MetaData DataTableImportOptional來迴避Import檢查
實際修改Enum Property,新增MetaData DataTableImportOptional如下:
UPROPERTY(meta = (DataTableImportOptional))
EAnimalType Type;
錯誤消失,任務完成。
おまけ
明明是蠻有用的功能,卻完全沒出現在官方文件上,只有在4.13的Release Note上出現幾行而已,有點可惜啊,希望看到這篇的人可以知道有這個功能XD
參考資料
https://docs.unrealengine.com/ja/Support/Builds/ReleaseNotes/2016/4_13/index.html
Engine/Source/RuntimeEngine/Private/DataTableJSON.cpp