Unreal Engine 4 のリレーショナル データ テーブル

6540 ワード

今日、Unreal Engine で興味深い問題が発生しました.ものを付けたい Mech キャラクターがあります.おそらく、それは鎧のセグメント、内部コンポーネント、または武器やその他の「もの」です.これらすべてのアタッチ ポイントとアタッチメントを管理するのは面倒なので、データ アセットとデータ テーブルを使用してデータ モデルに体系化したいと考えました.このようにして、将来、さまざまなスケルトンとさまざまなアタッチメントを備えた 100 個のメカを作成し、それらを単一の「MechCharacter」を持つデータとして完全に体系化することができます.

フルスタック ソフトウェア エンジニアとしての経歴を考えると、次のようなリレーショナル データベースにたどり着くのは本能的です.
  • データで共通の動作を推進する
  • 複数のデータ ソースを結び付ける
  • 自己検証と入力の制限

  • これは必ずしも完全な、またはまとまりのあるリストではありません.私はこれをかなり急いで書いています.しかし、基本的には、将来のアセットを構築する際に素晴らしい開発者エクスペリエンスを提供するデータ モデルとコードを構築したいと考えています.どこか一行でちょっとしたタイプミスをしたので変なバグはありません!

    最後に、まだ見つかっていないものがあるかもしれません.たぶんそれを行うための優れた方法がありますか?たぶん、私が打ち込むベストプラクティスの問題ですか?コメントで教えてください!


    では、これら 3 つの構造体と包括的なデータ アセットがあるとします.各構造体は、エディターでデータ テーブルを作成するために使用されます.

    USTRUCT(BlueprintType)
    struct FAttachPoint : public FTableRowBase
    {
        GENERATED_BODY()
    
    public:
        UPROPERTY(EditAnywhere, BlueprintReadWrite)
            FName Bone;
    };
    
    USTRUCT(BlueprintType)
    struct FArmorPiece : public FTableRowBase
    {
        GENERATED_BODY()
    
    public:
        UPROPERTY(EditAnywhere, BlueprintReadWrite)
            FName AttachPointRowKey;
    
        UPROPERTY(EditAnywhere, BlueprintReadWrite)
            UStaticMesh* Mesh;
    };
    
    USTRUCT(BlueprintType)
    struct FHardpoint : public FTableRowBase
    {
        GENERATED_BODY()
    
    public:
        UPROPERTY(EditAnywhere, BlueprintReadWrite)
            FName AttachPointRowKey;
    
        UPROPERTY(EditAnywhere, BlueprintReadWrite)
            UStaticMesh* Mesh;
    };
    
    UCLASS()
    class MECHGAME_API UDA_MechDefinition : public UDataAsset
    {
        GENERATED_BODY()
    
    public:
        UPROPERTY(EditAnywhere, BlueprintReadOnly)
            USkeletalMesh* Mesh;
    
        UPROPERTY(EditAnywhere, BlueprintReadOnly)
            UDataTable* ArmorTable;
    
        UPROPERTY(EditAnywhere, BlueprintReadOnly)
            UDataTable* HardpointsTable;
    };
    


    ArmorPiece と Hardpoint データ テーブルは単に AttachPoint の行キーを想定しているため、これは理想的ではありませんが、タイプミスをしたり、行の名前を変更して他のデータを更新するのを忘れたりする可能性があります. UE4 のエディタがこれらの FName を特定の AttachPoint データ テーブルにあるキーのみに制限できるとしたら?

    UE4 には、実際にこれを実現する方法がいくつか埋もれています.

    // For a reference to a table which uses a particular struct:
    
    UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (RequiredAssetDataTags = "RowStructure=ArmorPiece"))
    UDataTable* ArmorTable;
    



    // For a handle to a single row within a table which uses a particular struct:
    
    UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (RowType = "AttachPoint"))
    FDataTableRowHandle AttachPoint;
    


    新しいメタ情報は、データのリストを提供する方法をエディターに通知し、構造体タイプによって制限されます.これにより、後でデータ モデルを構成するときに間違いを犯しにくくなります.