8.

UE5 Data Table 完全ガイド(CSV/JSON取り込み/USTRUCT行構造/Blueprint参照)

編集
この記事の要点
  • Data Table = 表形式のデータを Asset として持つ仕組み。Excel/CSV 連携で量産が楽
  • 行構造USTRUCT または UScriptStruct をベースに定義
  • Editor で行追加/編集/CSV/JSON エクスポート&インポート
  • Blueprint からは Get Data Table Row(FName 検索)/C++FindRow<T>
  • 用途: アイテム/敵/会話/設定/ダイアログ/装備。Data Asset との使い分けはケースによる

Data Table とは

UE5 の Data Table は、表形式のデータ(行 × 列)をアセットとして保持する仕組みです。1 行 1 レコードで、CSV / JSON から取り込めるため、エクセル管理しているマスターデータをそのまま UE に流し込めます。

典型的な用途:

  • アイテム一覧(ID / 名前 / アイコン / 攻撃力 / 説明文)
  • 敵キャラのパラメータ表(HP / 攻撃力 / ドロップ ID)
  • 会話セリフ(ID / 話者 / 本文 / 次の ID)
  • クエスト定義 / 装備 / バフ / 設定値

行構造(Row Structure)を定義

Data Table を作る前に、1 行の中身を表すデータ構造が必要です。C++ では USTRUCT + FTableRowBase、Blueprint では Structure アセットで定義します。

C++ で定義

// ItemData.h
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "ItemData.generated.h"

USTRUCT(BlueprintType)
struct FItemRow : public FTableRowBase
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite) FName ItemId;
    UPROPERTY(EditAnywhere, BlueprintReadWrite) FText DisplayName;
    UPROPERTY(EditAnywhere, BlueprintReadWrite) int32 Attack = 0;
    UPROPERTY(EditAnywhere, BlueprintReadWrite) int32 Price  = 0;
    UPROPERTY(EditAnywhere, BlueprintReadWrite) TSoftObjectPtr<UTexture2D> Icon;
    UPROPERTY(EditAnywhere, BlueprintReadWrite) FText Description;
};

Blueprint で定義

Content Browser → 右クリック → Blueprints → StructureS_ItemRow。ItemId(Name)、DisplayName(Text)、Attack(Integer)など列を追加します。

Data Table アセットの作成

  1. Content Browser → 右クリック → Miscellaneous → Data Table
  2. 「Pick Row Structure」で先ほど作った FItemRow / S_ItemRow を選択
  3. DT_Items として保存
  4. ダブルクリックで Editor が開き、行追加・編集が可能

CSV から取り込む

マスターデータは Excel / スプレッドシートで作って CSV エクスポートし、Data Table にインポートするのが王道です。

Name,DisplayName,Attack,Price,Description
"sword01","鋼の剣",10,100,"基本的な剣です"
"sword02","炎の剣",25,500,"火属性付与"
"potion01","ポーション",0,30,"HP を 50 回復"

1 列目は必ず Name(Row Name となる識別子)です。

取り込み手順

  1. Content Browser → CSV をドラッグ&ドロップ
  2. 「DataTable Row Type」で行構造を選択
  3. インポート完了。再インポートも CSV 更新 → 右クリック → Reimport

Blueprint から行を取得

Get Data Table Row
  Data Table  → DT_Items
  Row Name    → "sword01"
  ↓
分岐: Found / NotFound
  Found  → Break Struct → DisplayName, Attack を使用
  NotFound → エラー処理

C++ から行を取得

UPROPERTY(EditAnywhere) UDataTable* ItemTable;

void AMyGameMode::SetupItem(FName Id)
{
    if (!ItemTable) return;
    static const FString Ctx(TEXT("ItemLookup"));
    FItemRow* Row = ItemTable->FindRow<FItemRow>(Id, Ctx);
    if (Row)
    {
        UE_LOG(LogTemp, Log, TEXT("%s ATK=%d"), *Row->DisplayName.ToString(), Row->Attack);
    }
}

全 Row を取り出す

TArray<FName> Names = ItemTable->GetRowNames();
for (const FName& Name : Names)
{
    FItemRow* Row = ItemTable->FindRow<FItemRow>(Name, TEXT(""));
    // 表示・処理
}

// 全件マップ取得
TMap<FName, uint8*> Map = ItemTable->GetRowMap();

Blueprint では Get Data Table Row Names ノードを使います。

CSV / JSON エクスポート

Data Table エディタの上部メニューから Export As CSV / JSON で外部出力できます。バージョン管理や校正用に便利です。

Data Table と Data Asset の使い分け

項目Data TableData Asset
レコード単位表形式(1 行 1 レコード)1 アセット 1 オブジェクト
取り込みCSV/JSON から一括個別作成
参照FName で検索直接参照(Soft / Hard)
変更頻度マスタデータ向き個別ロジック向き
Blueprint で派生不可可(Blueprintable)
アイテム一覧 / 敵パラメータ武器プロパティ / Boss 構成

多言語対応(ローカライズ)

Data Table の FText 列はそのまま UE のローカライゼーションシステムに乗ります。 FString ではなく FText を使うのが必須。Editor の Gather Text フローでキー抽出され、翻訳テーブルが作れます。

運用 Tips

  • CSV の1 列目 Name は重複不可。重複行はインポート時に警告
  • ID(Name 列)は意味のある文字列(sword01 等)にしてデバッグ性を確保
  • 大量行は Editor の表示が重くなる → 分割 Data Table or Data Asset 化
  • 列追加時は Struct を変更後 Data Table の Reimport
  • Hot Reload で構造変更後にクラッシュする場合は Editor 再起動が確実
  • Asset Soft Reference(TSoftObjectPtr)にすると遅延ロードになりメモリ節約

サンプル: アイテムショップ実装

void AShopManager::RefreshShopList()
{
    TArray<FName> Names = ItemTable->GetRowNames();
    for (FName N : Names)
    {
        if (auto* Row = ItemTable->FindRow<FItemRow>(N, TEXT("")))
        {
            FShopEntry Entry;
            Entry.Id    = Row->ItemId;
            Entry.Name  = Row->DisplayName;
            Entry.Price = Row->Price;
            ShopList.Add(Entry);
        }
    }
}

FAQ

Q: 行を動的に追加できる?
A: ランタイムで UDataTable::AddRow は可能ですが、Shipping ビルドでは不可。ランタイム編集は Data Asset や独自構造のほうが向きます。

Q: CSV インポートで日本語が文字化け
A: CSV を UTF-8 (BOM 付き) で保存してください。Excel で「CSV UTF-8」を選ぶか、テキストエディタで BOM 付き変換。

Q: 行の編集を制限したい
A: Source CSV を Single Source of Truth とし、Editor 側を読み取り専用にする運用が一般的。Reimport で常に CSV を反映させます。

編集
Post Share
子ページ
  1. 構造体付きデータテーブルの中身をウィジェットに表示する方法
同階層のページ
  1. ノード・コンポーネント・関数・クラス一覧
  2. Tips
  3. エラー一覧
  4. ブループリント (Blueprint)
  5. プロジェクト (Project)
  6. レベル (Level)
  7. ウィジェット (Widget)
  8. データテーブル (DataTable)
  9. アセット
  10. アウトライナー
  11. ビュー
  12. レイヤー
  13. レイアウト
  14. ビルド
  15. ライティング
  16. ジオメトリ
  17. アクタ
  18. トランスフォーム
  19. スナップ
  20. ピボット
  21. コンテンツドロワー
  22. コンポーネント
  23. メッシュ
  24. マテリアル
  25. World Composition
  26. World Partition
  27. Unreal Insights
  28. セーブ&ロード

最近更新/作成されたページ