UE4中使用數據表(Data Table)


本文依據官方文檔數據驅動游戲性元素整理而來。

做過游戲的應該都清楚,如果游戲稍微有點規模,那么使用數據驅動來做游戲一般是必不可少的一步,一般也就是策划通過本表的方式來解決。下面我們來簡單說一下UE4中如何使用DataTable來實現數據驅動開發。

顧名思義,數據表就是以有意義且有用的方式將各種相關的數據歸類的表格, 其中,數據字段可以是任何有效的 UObject 屬性,包括資產引用。在設計師將 CSV 文件導入數據表前,程序員必須創建行容器以指示引擎如何解釋數據。 這些數據表包含了列名,這些列名和基於代碼的UStruct結構以及它的(子)變量一一對應, 這個UStruct的結構必須繼承自FTableRowBase才可以被導入器辨識。

我們隨便建了一張測試表(csv)如下所示:

Id,HP,Icon,BlueprintKey

1,100,Texture2D'/Game/FirstPerson/Textures/Test.Test',Class'/Game/FirstPerson/BP_DataTableTest.BP_DataTableTest_C'

2,200,Texture2D'/Game/FirstPerson/Textures/Test.Test',Class'/Game/FirstPerson/BP_DataTableTest.BP_DataTableTest_C'

其中BP_DataTableTest是一個繼承自AActor的一個藍圖類,BP_DataTableTest_C是實際生成的藍圖類。

對應的C++代碼如下所示:

/** 注意此結構體中的成員變量的名字要跟csv表中的相同,因為它是UE4里面是通過反射系統來實現數據的
初始化的,當然名字不同也可以,但是它的元數據中的DisplayName就必須跟表中的字段值對應,具體可以參考
DataTableCSV.cpp中的實現就可以了解。*/
USTRUCT(BlueprintType)
struct FDataTableTestData : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

public:

	FDataTableTestData()
		: HP(0)
	{}


	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test")
	int32 HP;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test")
	TAssetPtr<UTexture2D> Icon;

	// 注意此變量名跟csv中的不同,但是我把它的DisplayName設置成了"BlueprintKey"這樣也是可以的
	// 還有注意我使用了TAssetSubclassOf而不是TAssetPtr,因為如果是類的話需要使用這個。
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DataTable Test", DisplayName = "BlueprintKey")
	TAssetSubclassOf<AActor> BP;
};

  

代碼編譯完成后,我們就可以把剛才創建好的csv文件導入到編輯器中,通過Import導入文件,導入后如下圖所示:

在藍圖里面用法如下圖所示:

注意:

在上述數據表示例中,引用的資產為延遲加載資產(TAssetPtr 處理此事項,我們最終使用了LoadAssetLoad Class Asset來實現異步加載,注意右上角的時鍾圖標)。如果資產字段類型設置為 UTexture,則將在加載數據表時加載所有資產。關於UE4中資源的同步和異步加載問題,將在另一篇文章中單獨來討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM