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++程式碼如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/**
注意此結構體中的成員變數的名字要跟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 處理此事項,我們最終使用了LoadAsset和Load Class Asset來實現非同步載入,注意右上角的時鐘圖示)。如果資產欄位型別設定為 UTexture,則將在載入資料表時載入所有資產。關於UE4中資源的同步和非同步載入問題,將在另一篇文章中單獨來討論。