Skip to content

strangechu's Blog

  • About me
  • GitHub
  • LinkedIn

strangechu's Blog

Work & Game

[UE4] 處理DataTable的Import資料格式轉換

8 月 31, 2020 by strangechu

問題

假設我們有一個含有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

Post navigation

Previous Post:

[UE4]從C++呼叫Blueprint實裝的interface函式

Next Post:

個人遊戲月報 2020年8月

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

近期文章

  • 從《33遠征隊》看日本遊戲業的未來——JRPG的蛻變與停滯
  • 機戰傭兵6 玩後感
  • 沉沒意志 玩後感
  • Fallout影集觀後感
  • [CEDEC2024]薩爾達的餘料建造開發減法

近期留言

  • 「strangechu」於〈個人遊戲月報 2020年8月〉發佈留言
  • 「扇」於〈個人遊戲月報 2020年8月〉發佈留言

彙整

  • 2025 年 5 月
  • 2025 年 1 月
  • 2024 年 9 月
  • 2024 年 8 月
  • 2024 年 5 月
  • 2024 年 4 月
  • 2024 年 3 月
  • 2024 年 1 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2023 年 8 月
  • 2023 年 6 月
  • 2023 年 5 月
  • 2023 年 4 月
  • 2023 年 3 月
  • 2023 年 1 月
  • 2022 年 12 月
  • 2022 年 10 月
  • 2022 年 9 月
  • 2022 年 5 月
  • 2022 年 3 月
  • 2022 年 2 月
  • 2022 年 1 月
  • 2021 年 12 月
  • 2021 年 10 月
  • 2021 年 3 月
  • 2020 年 12 月
  • 2020 年 11 月
  • 2020 年 10 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 3 月
  • 2020 年 2 月
  • 2019 年 7 月
  • 2019 年 4 月

分類

  • Career
  • Game
  • Game Review
  • Monthly Report
  • UE4
  • UE5
  • Uncategorized
  • 技術
  • 演講心得

其他操作

  • 登入
  • 訂閱網站內容 RSS 資訊提供
  • 訂閱網站留言 RSS 資訊提供
  • WordPress 台灣繁體中文
© 2025 strangechu's Blog | WordPress Theme by Superbthemes