LoginSignup
2

More than 3 years have passed since last update.

UE4 DataTableからのパラメータ取得とJSONインポートについて

Last updated at Posted at 2019-11-16

概要

UnrealEngine のデータテーブルについてのメモです。
また、運用方法についてもExcelからのDataTableにインポートする方法を試してみます。

更新履歴

日付 内容
2020/09/17 JSONデータ再インポートが反映されない場合の備考を追記

環境

Windows10
Visual Studio 2017
UnrealEngine 4.22, 4.25

参考

以下を参考にさせて頂きました、ありがとうございます。

UnrealEngine - データ駆動型のゲームプレイエレメント
[UE4][C++] ユーザー定義オブジェクトのアセット化で楽をする

データテーブル作成

コンテンツブラウザから右クリック [その他] -> [データテーブル] で作成できます。

データテーブル型定義

定義するにはFTableRowBaseを継承した構造体の定義が必要です。BPでもC++でも可能のようです。

以下、C++でのテストコードです。

USTRUCT(BlueprintType, DisplayName = "パラメータ")
struct FMyDataTable : public FTableRowBase
{
    GENERATED_USTRUCT_BODY()

public:
    // コンストラクタ
    FMyDataTable():
        Id(-1),
        Param(0.0f)
    {}

public:
    // ID
    UPROPERTY(Category = "FMyDataTable", EditAnywhere, DisplayName = "Id")
    int32   Id;
    // パラメータ
    UPROPERTY(Category = "FMyDataTable", EditAnywhere, meta = (ClampMin="0.0", ClampMax="1.0"), DisplayName = "Param")
    float       Param;
};

[新規追加] -> [その他] -> [データテーブル]で新規作成する際に定義したDisplayNameで構造体を選択できます。
CreateDataTable.png

作成したデータテーブルを開くと定義したメンバが確認できます。
MyDataTable.png

データテーブルアクション

CSVやJSONでエクスポートができます。エクスポートしたデータに変更があれば再インポートするように通知設定すると便利です。

DataTableAction.jpg

[編集] -> [エディタの環境設定] -> [一般 - ロード&保存中] -> [Directories to Monitor] の設定で監視するディレクトリ設定ができます。
EditorSetting.png

再インポートが検出されると確認ダイアログがでます。
import_dialog.jpg

データテーブルからデータの取得

MyDataTableに保持されたデータテーブルからパラメータを取得する例です。

.h
// データテーブル
UPROPERTY(Category = "Test", EditAnywhere, BlueprintReadWrite)
class UDataTable*   MyDataTable;

.cpp
// データテーブルからパラメータを取り出す
if (MyDataTable != nullptr) {
    // データテーブル取得
    auto _Names = MyDataTable->GetRowNames();
    for (int _Lp = 0; _Lp < _Names.Num(); _Lp++)
    {
        auto _Record = MyDataTable->FindRow<FMyDataTable>(_Names[_Lp], FString());
        // 表示
        UE_LOG(LogTemp, Log, TEXT("%d, %f"), _Record->Id, _Record->Param);
    }
}

パラメータ用のデータテーブル運用について

データテーブルをエディタで編集することが可能ですが、別途外部データからの運用を考えてみます。公式にはcsvからのインポートする方法が紹介されています。

Excel -> JSONでの運用例

以下の様なパラメータテーブルを作り、マクロを有効にして[JSON出力]ボタンを押したらJSONデータで出力できるようにします。
JSONへの出力方法は外部ツールを別途つくるなり方法はいろいろ考えられます。

excel.png

別途JSONへの出力する方法を用意してバッチ等で呼び出す方法を取る場合はボタンに割り振るマクロは以下の様になります。VBに慣れているのであれば直接書けると思います。

VBAマクロから外部バッチ実行
Sub CommandExec()
    Dim processId  As Double
    Dim batPath

    ' 現在のマクロ実行パスからバッチ実行
    batPath = ThisWorkbook.Path & "\myparam_conv.bat"

    processId = Shell(batPath)
End Sub

JSON出力すると以下の様になります。

_test.json
[
    {
        "Name": "01",
        "Kind": "りんご",
        "Param": 500,
        "Num": 3,

    },
    {
        "Name": "02",
        "Kind": "みかん",
        "Param": 700,
        "Num": 2,
    },
    {
        "Name": "03",
        "Kind": "ぶどう",
        "Param": 700,
        "Num": 1,
    }
]

このJSONを自動インポートして、DataTableに再インポートするように UEエディタ設定を行うと、余計な操作が減るためパラメータ調整のイテレーションが減ると思います。

JSONからDataTableへインポートする時、DataTableを定義している構造体のメンバ名とJSONメンバ名が一致しているものだけ取り込まれます。
上記で定義した FMyDataTable の場合は一致するメンバ名が[Param]だけなので以下のJSONからそこだけ取得されるので注意が必要です。
(ExcelからJSONに出力する際にチェック機能などがあると良いと思います。)

備考

JSONを変更して再インポートをしても反映されない場合

データテーブルを右クリックして インポートアセット のメニューがグレーアウトしている状態だと思われます。

example00.jpg

この場合は、データテーブルを開いてエディタ上から
[アセット] → [〇〇を再インポート] を選択して再インポートをします。

example01.jpg

これで インポートアセット のメニューが選択できるようになり、JSONの変更を再インポートしても反映されるようになります。

まとめ

パラメータなどは独自のアセットを作成するより、DataTableで間に合う場合が多いと思いますが、そのままではやや扱いにくいです。
公式にはcsvへエクスポートをするエクセルマクロファイルのサンプルがありますが、データ整合性なども考えJSONでの運用をしてみました。
Pluginなどにすでにありそうな気もしますが。:grinning:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2