main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

【UE5】DataTableを使ってみよう!(C++編)②

概要

データテーブルは、構造化データを整理するためのテーブル形式のデータ構造です。
前回はデータテーブルの定義の方法やデータの作成方法などを紹介しました。

www.main-function.com

今回はどういう型が使用できるかなどをまとめてみました。

※本記事はC++での開発を前提としています。

動作環境

UnrealEngine 5.4.4

実装

前回のEnemyDataの構造体にパラメータを追加してみたいと思います。
enumの扱いを試すために以下のenumを定義しておきます。

UENUM(BlueprintType)
enum class EEnemyType : uint8
{
    None,
    Warrior,    // 戦士.
    Mage,       // 魔法使い.
};

構造体の扱いを試すために以下の構造体も定義しておきます。
USTRUCTでBulueprintTypeを指定しておく必要があります。
操作したいメンバーにはUPROPERTYを付けておく必要があります。

USTRUCT(BlueprintType)
struct HOGE_API FEnemyCustomParam
{
public:
    GENERATED_USTRUCT_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    FName Name;

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    int32 Age;

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    float Score;
};

前回使用したEnemyDataに定義したenumや構造体を追加してみます。
FVectorやFRorator、TArrayのコンテナも追加してみます。
固定長の配列はUPROPERTYで扱うことができないようで、コンパイルエラーとなります。

USTRUCT(BlueprintType)
struct HOGE_API FEnemyData : public FTableRowBase
{
    GENERATED_BODY()

public:

    // 攻撃力.
    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    int32 Attack = 0;

    // 防御力.
    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    int32 Defence = 0;

    // HP.
    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    int32 HP = 0;

    // タイプ.
    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    EEnemyType EnemyType = EEnemyType::None;

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    FEnemyCustomParam CustomParam;

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    FVector VectorParam;

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    FRotator RotatorParam;

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    TArray<int32> IntParams;

    //UPROPERTY(EditAnywhere, BlueprintReadOnly)
    //int32 IntParams[2];

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    TArray<FName> NameParams;
};

コンパイル後に前回作成したDT_EnemyTableを開くと追加した項目がプロパティに追加されていることが確認できます。

enumはドロップダウンリストから選択できるようになります。

別に用意した構造体も各メンバーもそのまま編集できます。

Vector、RotatorもX,Y,Zそれぞれ入力することができます。

TArrayの可変長配列も配列の追加/削除が行えて、それぞれに入力することができます。

エクスポート

追加したデータをCSVでエクスポートしてみます。
以下の様な内容で出力されています。
enumは文字列で出力されているようです。
構造体も定義したメンバーそれぞれがテキストで出力され、そのメンバーの値がカンマ(,)区切りで出力されて、構造体全体が括弧で括られて一つのカラムの値として出力されているようです。
Vector、Rotatorも同様にそれぞれのフォーマットで出力されています。
※Roratorはpitch,pan,rollではなくX,Y,Zとなっているようなので注意が必要です。
TArrayもフォーマットが決まっていて、同様に括弧で括られてその中に要素数分だけカンマ区切りで値が出力されているようです。

---,Attack,Defence,HP,EnemyType,CustomParam,VectorParam,RotatorParam,IntParams,NameParams
Enemy000,"0","0","0","Warrior","(Name="""",Age=0,Score=0.000000)","(X=0.000000,Y=100.000000,Z=0.000000)","(Pitch=0.000000,Yaw=0.000000,Roll=0.000000)","(0,10)","(""DropItem000"","""","""","""")"
Enemy001,"0","0","0","Mage","(Name="""",Age=0,Score=0.000000)","(X=0.000000,Y=0.000000,Z=0.000000)","(Pitch=0.000000,Yaw=0.000000,Roll=0.000000)","",""

インポート

エクスポートしたcsvの一部を編集してみます。
構造体のNameやAgeに値を設定してみます。

---,Attack,Defence,HP,EnemyType,CustomParam,VectorParam,RotatorParam,IntParams,NameParams
Enemy000,"0","0","0","Warrior","(Name=""Text_Enemy000"",Age=15,Score=0.000000)","(X=0.000000,Y=100.000000,Z=0.000000)","(Pitch=0.000000,Yaw=0.000000,Roll=0.000000)","(0,10)","(""DropItem000"","""","""","""")"
Enemy001,"0","0","0","Mage","(Name="""",Age=0,Score=0.000000)","(X=0.000000,Y=0.000000,Z=0.000000)","(Pitch=0.000000,Yaw=0.000000,Roll=0.000000)","",""

この状態でインポートしてみます。
編集した値が反映されていることが確認できます。

試しに以下のパラメータを追加してみます。
一行追加して、EnemyTypeにenumに無い値(Theif)を設定してみます。

---,Attack,Defence,HP,EnemyType,CustomParam,VectorParam,RotatorParam,IntParams,NameParams
Enemy000,"0","0","0","Warrior","(Name=""Text_Enemy000"",Age=15,Score=0.000000)","(X=0.000000,Y=100.000000,Z=0.000000)","(Pitch=0.000000,Yaw=0.000000,Roll=0.000000)","(0,10)","(""DropItem000"","""","""","""")"
Enemy001,"0","0","0","Mage","(Name="""",Age=0,Score=0.000000)","(X=0.000000,Y=0.000000,Z=0.000000)","(Pitch=0.000000,Yaw=0.000000,Roll=0.000000)","",""
Enemy002,"0","0","0","Thief","(Name="""",Age=0,Score=0.000000)","(X=0.000000,Y=0.000000,Z=0.000000)","(Pitch=0.000000,Yaw=0.000000,Roll=0.000000)","",""

このcsvをインポートした際にはエラーが出るようです。

FVectorやFRorator、TArrayなどをcsvで編集するのは厳しいので、Excelコンバーターなどを用意してcsvに変換した方が良さそうです。