【Unreal Engine】Data Tableでパラメータを管理する:CSVで調整できるようにする

作成: 2025-12-12最終更新: 2026-07-20

数値を変えるたびにBlueprintを開くのをやめる。構造体を行の形にしたData Tableと、CSVで一括編集する手順を図解。敵のパラメータを表で管理し、スポーン時に読み込む実践つき。

敵の攻撃力を10から12に変えたい。それだけのために Blueprintを開いて、変数を探して、コンパイルして、Playする 。1回なら平気ですが、バランス調整は何十回も繰り返す作業です。

Data Table は、こうした数値を 表として外に出す 仕組みです。Excelで開いて一括で調整し、まとめて取り込める。Blueprintは「表からこの行を読む」とだけ書いておけば、以降は触りません。

この記事では、Data Tableの作り方とCSVの取り込み方、そして 敵のパラメータを表で管理して、スポーン時に読み込む 方法を解説します。

Blueprintの中に埋もれた数値が、表として外に出るイメージ

この記事でわかること

  • Data Tableは 構造体を「行の形」として並べた表
  • Row Name が各行のキー(ここが最重要)
  • CSVは 1列目がRowName、1行目が変数名と完全一致
  • 日本語を含むなら BOM付きUTF-8
  • 実践:敵のパラメータを表で管理し、スポーン時に読み込む

Sponsored

Data Tableは「構造体の表」

Data Tableを一言でいうと、 構造体を1行の形にして、何行も並べたもの です。

構造体が1行の形を決め、その形の行が何行も並んでいる表の図

つまり 構造体が先に必要 です。「攻撃力」「HP」「移動速度」を持つ構造体を作れば、それが表の になります。あとは行を足していくだけ。

Row NameAttackHealthSpeed
Slime530200
Goblin1260350
Ogre30200150

この形にしておくと、次のことができるようになります。

  • 数値の調整がBlueprintの外で完結する: コンパイルも不要
  • 一覧できる: 敵ごとのバランスを並べて見比べられる
  • Excelで編集できる: CSVで書き出し・取り込み

そして、Blueprint側は Goblin の行を読む」 と書くだけになります。数値そのものは知りません。

作る手順

ステップは2つ です。構造体を作り、それを指定してData Tableを作ります。

構造体を作り、それを行の形に指定してData Tableを作る2ステップの図

1. 構造体を作る

右クリック → BlueprintsStructure 。項目を定義します(→ 構造体の作り方)。

2. Data Tableを作る

右クリック → MiscellaneousData Table 。ここで Row Structure(行の構造体) を聞かれるので、作った構造体を選びます。

Row Structureは後から変えられません。 作成時に選んだ構造体で固定されます。別の形にしたくなったら、Data Tableを作り直すことになるので、 構造体の項目を固めてから 作るのが安全です。

C++で構造体を定義する場合は、 FTableRowBase を継承する 必要があります。Blueprintで作った構造体は、そのままRow Structureに指定できます。

USTRUCT(BlueprintType)
struct FEnemyData : public FTableRowBase   // ← これが必要
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    int32 Attack = 0;

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    float Health = 100.0f;
};

CSVで一括編集する

Data Tableはエディタ上でも編集できますが、 行数が増えるとCSVのほうが圧倒的に速い です。

CSVの1列目がRowName、1行目が構造体の変数名と一致している必要があることを示す図

CSVには 決まった形式 があります。ここを外すとインポートが失敗します。

Name,Attack,Health,Speed
Slime,5,30,200
Goblin,12,60,350
Ogre,30,200,150
ルール内容
1列目各行のキー(Row Name)。重複させない
1行目構造体の 変数名と完全一致 。大文字小文字も区別
区切りカンマ
文字コード日本語を含むなら BOM付きUTF-8

取り込み方は2通り です。

  • 既存のData Tableに上書き: アセットを右クリック → Reimport (または Import
  • CSVから新規作成: CSVをコンテンツブラウザに ドラッグ&ドロップ し、Row Structureを選ぶ

日々の調整では前者を使います。CSVを直して、右クリックして取り込むだけです。

文字化けしたら、保存形式を疑う。 Excelで普通に「CSV」を選ぶと、環境によってはShift-JISになります。 「CSV UTF-8(コンマ区切り)」 を選ぶか、テキストエディタでBOM付きUTF-8として保存し直してください。

Blueprintから読む

読み出しは Get Data Table Row ノード1つで済みます。

Get Data Table RowにData TableとRow Nameを渡し、Out RowとFound Rowが返る様子の図
ピン内容
Data Tableどの表を読むか
Row Nameどの行を読むか(キー)
Out Row見つかった行の構造体
Found Row見つかったかどうか(Boolean)

そして ここが最大の注意点 です。

見つからなくても、エラーにはなりません。 Out Row には 空の構造体(全部0や空文字) が返ります。だから「なぜか攻撃力が0になる」という形で症状が出て、原因に気づきにくい。 Found Row で必ず分岐してください。

Row Nameのタイプミスは日常的に起きます。Goblingoblin は別物として扱われます。

Sponsored

実践:敵のパラメータを表で管理する

RPGのモンスター、タワーディフェンスの敵ウェーブ、シューティングの敵機——「同じ仕組みで、数値だけ違う敵」はどのジャンルにも出てきます。ここでは 敵1体ずつBlueprintを作るのをやめて、表で管理する 形に変えます。

再現用の準備: 次を用意します。

種類名前内容
StructureS_EnemyData敵1種類のパラメータ
Data TableDT_EnemyRow Structure に S_EnemyData
CharacterBP_Enemy1つだけ 。数値は表から読む

ステップ1:構造体を作る。 S_EnemyData に次の項目を作ります。

変数名デフォルト値
AttackInteger0
HealthFloat100.0
MoveSpeedFloat300.0

ステップ2:Data Tableを作る。 右クリック → MiscellaneousData Table → Row Structure に S_EnemyData を選択。DT_Enemy と名付けます。

ステップ3:CSVを用意して取り込む。 テキストエディタで次を書き、BOM付きUTF-8Enemy.csv として保存します。

Name,Attack,Health,MoveSpeed
Slime,5,30,200
Goblin,12,60,350
Ogre,30,200,150

DT_Enemy を右クリック → Reimport (または Import)でこのCSVを選びます。開くと 3行が表示されている はずです。

ステップ4:敵に読ませる。 BP_Enemy に変数を2つ作ります。

変数名設定
EnemyRowNameNameInstance Editable にチェック(レベル上で指定するため)
CurrentHealthFloat初期値 0.0

そして BeginPlay で表から読みます。

BeginPlayからGet Data Table Row、Found Rowで分岐してパラメータを適用するノードグラフ
Event BeginPlay(BP_Enemy)
  → Get Data Table Row(Data Table: DT_Enemy, Row Name: EnemyRowName)
  → Branch(Condition: Found Row)
      True  → Break S_EnemyData(Out Row)
            → Set CurrentHealth(= Health)
            → Set Max Walk Speed(Target: Character Movement, = MoveSpeed)
            → Print String(Append("読み込み成功: ", EnemyRowName))
      False → Print String(Append("行が見つからない: ", EnemyRowName))  ← ★必ず用意する

Found Row の分岐を必ず書く のがポイントです。これがないと、行が無くても静かに0で動いてしまいます。

ステップ5:レベルに置いて確かめる。 BP_Enemy を3体レベルに配置し、それぞれの詳細パネルで Enemy Row NameSlime / Goblin / Ogre に設定します。

Playして確認してください。 3体とも同じBlueprintなのに、移動速度が明らかに違う はずです。Slimeは遅く、Goblinは速く、Ogreはさらに遅い。ログにも「読み込み成功」が3件出ます。

Data Tableの効果が出るのは、ここから先です。Enemy.csv を開いて GoblinMoveSpeed600 に変え、Reimport してPlayしてみてください。 Blueprintを一度も開かずに、Goblinだけが速くなります

うまくいかないときの切り分けです。

  • 「行が見つからない」と出る → Row Nameの綴りか大文字小文字。表に表示されている名前をコピーして貼るのが確実
  • インポートで文字化け → BOM付きUTF-8で保存し直します
  • インポートしても行が増えない → CSVの1行目が構造体の変数名と一致していません
  • 速度が変わらないSet Max Walk SpeedTarget に Character Movement を繋いでいますか

ポイントは2つです。

  • Found Row を無視しない: 見つからなくても空の構造体が返るので、静かに0で動きます。 失敗をログに出す だけで、原因究明の時間が大きく変わります
  • Blueprintを1つに保つ: 敵の種類ごとにBlueprintを作ると、共通処理を直すたびに全部を触ることになります。 仕組みは1つ、数値は表 が保守しやすい形です

同じデータを「表」ではなく アセット単位 で持ちたくなったら、Data Asset が次の選択肢です。行の形そのものを見直したくなったら 構造体 へ戻ってください。

Sponsored

おまけ:先に知っておくと良いこと

CSVはプロジェクト内に置いておくと管理が楽です。 Content/Data/CSV のようなフォルダを作って原本を置いておけば、Gitで差分も追えます。ただし Content 直下に置くとUEがアセットとして扱おうとするので、置き場所は決めておくと事故が減ります。

行の一覧を取れます。 Get Data Table Row Names を使うと、表に入っている全Row Nameが配列で返ります。「ランダムな敵を出す」「図鑑に全項目を並べる」といった処理は、これが起点になります。

Data Tableは実行中に書き換えるものではありません。 あくまで 設定値の置き場所 です。「現在のHP」のように変化する値は、読み込んだあとBlueprint側の変数で持ちます。実践で HealthCurrentHealth に写しているのはそのためです。

構造体を変えると、表の中身が飛ぶことがあります。 項目を追加・削除すると、入れたデータがリセットされる場合があります。 変更前にCSVへエクスポート しておけば、崩れても戻せます。右クリック → Export で書き出せます。


まとめ

Data Tableを使うときに押さえる点は、この4つです。

観点結論
前提構造体が先 。Row Structureは後から変えられない
キーRow Name で行を引く。大文字小文字を区別
CSV1列目がキー、1行目が変数名と完全一致、 BOM付きUTF-8
最大の注意見つからなくても エラーにならないFound Row で分岐する

そして設計の指針が1つ。 仕組みは1つ、数値は表 です。敵の種類ごとにBlueprintを増やすのをやめると、調整も修正もぐっと楽になります。

いま調整のたびに開いているBlueprint、その数値は表に出せませんか?