敵の攻撃力を10から12に変えたい。それだけのために Blueprintを開いて、変数を探して、コンパイルして、Playする 。1回なら平気ですが、バランス調整は何十回も繰り返す作業です。
Data Table は、こうした数値を 表として外に出す 仕組みです。Excelで開いて一括で調整し、まとめて取り込める。Blueprintは「表からこの行を読む」とだけ書いておけば、以降は触りません。
この記事では、Data Tableの作り方とCSVの取り込み方、そして 敵のパラメータを表で管理して、スポーン時に読み込む 方法を解説します。
この記事でわかること
- Data Tableは 構造体を「行の形」として並べた表
- Row Name が各行のキー(ここが最重要)
- CSVは 1列目がRowName、1行目が変数名と完全一致
- 日本語を含むなら BOM付きUTF-8
- 実践:敵のパラメータを表で管理し、スポーン時に読み込む
Data Tableは「構造体の表」
Data Tableを一言でいうと、 構造体を1行の形にして、何行も並べたもの です。

つまり 構造体が先に必要 です。「攻撃力」「HP」「移動速度」を持つ構造体を作れば、それが表の 列 になります。あとは行を足していくだけ。
| Row Name | Attack | Health | Speed |
|---|---|---|---|
Slime | 5 | 30 | 200 |
Goblin | 12 | 60 | 350 |
Ogre | 30 | 200 | 150 |
この形にしておくと、次のことができるようになります。
- 数値の調整がBlueprintの外で完結する: コンパイルも不要
- 一覧できる: 敵ごとのバランスを並べて見比べられる
- Excelで編集できる: CSVで書き出し・取り込み
そして、Blueprint側は 「Goblin の行を読む」 と書くだけになります。数値そのものは知りません。
作る手順
ステップは2つ です。構造体を作り、それを指定してData Tableを作ります。

1. 構造体を作る
右クリック → Blueprints → Structure 。項目を定義します(→ 構造体の作り方)。
2. Data Tableを作る
右クリック → Miscellaneous → Data 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には 決まった形式 があります。ここを外すとインポートが失敗します。
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つで済みます。

| ピン | 内容 |
|---|---|
| Data Table | どの表を読むか |
| Row Name | どの行を読むか(キー) |
| Out Row | 見つかった行の構造体 |
| Found Row | 見つかったかどうか(Boolean) |
そして ここが最大の注意点 です。
見つからなくても、エラーにはなりません。
Out Rowには 空の構 造体(全部0や空文字) が返ります。だから「なぜか攻撃力が0になる」という形で症状が出て、原因に気づきにくい。Found Rowで必ず分岐してください。
Row Nameのタイプミスは日常的に起きます。Goblin と goblin は別物として扱われます。
実践:敵のパラメータを表で管理する
RPGのモンスター、タワーディフェンスの敵ウェーブ、シューティングの敵機——「同じ仕組みで、数値だけ違う敵」はどのジャンルにも出てきます。ここでは 敵1体ずつBlueprintを作るのをやめて、表で管理する 形に変えます。
再現用の準備: 次を用意します。
| 種類 | 名前 | 内容 |
|---|---|---|
| Structure | S_EnemyData | 敵1種類のパラメータ |
| Data Table | DT_Enemy | Row Structure に S_EnemyData |
| Character | BP_Enemy | 1つだけ 。数値は表から読む |
ステップ1:構造体を作る。 S_EnemyData に次の項目を作ります。
| 変数名 | 型 | デフォル ト値 |
|---|---|---|
Attack | Integer | 0 |
Health | Float | 100.0 |
MoveSpeed | Float | 300.0 |
ステップ2:Data Tableを作る。 右クリック → Miscellaneous → Data Table → Row Structure に S_EnemyData を選択。DT_Enemy と名付けます。
ステップ3:CSVを用意して取り込む。 テキストエディタで次を書き、BOM付きUTF-8 で Enemy.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つ作ります。
| 変数名 | 型 | 設定 |
|---|---|---|
EnemyRowName | Name | Instance Editable にチェック(レベル上で指定するため) |
CurrentHealth | Float | 初期値 0.0 |
そして BeginPlay で表から読みます。

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 Name を Slime / Goblin / Ogre に設定します。
Playして確認してください。 3体とも同じBlueprintなのに、移動速度が明らかに違う はずです。Slimeは遅く、Goblinは速く、Ogreはさらに遅い。ログにも「読み込み成功」が3件出ます。
Data Tableの効果が出るのは、ここから先です。Enemy.csv を開いて Goblin の MoveSpeed を 600 に変え、Reimport してPlayしてみてください。 Blueprintを一度も開かずに、Goblinだけが速くなります 。
うまくいかないときの切り分けです。
- 「行が見つからない」と出る → Row Nameの綴りか大 文字小文字。表に表示されている名前をコピーして貼るのが確実
- インポートで文字化け → BOM付きUTF-8で保存し直します
- インポートしても行が増えない → CSVの1行目が構造体の変数名と一致していません
- 速度が変わらない →
Set Max Walk SpeedのTargetに Character Movement を繋いでいますか
ポイントは2つです。
Found Rowを無視しない: 見つからなくても空の構造体が返るので、静かに0で動きます。 失敗をログに出す だけで、原因究明の時間が大きく変わります- Blueprintを1つに保つ: 敵の種類ごとにBlueprintを作ると、共通処理を直すたびに全部を触ることになります。 仕組みは1つ、数値は表 が保守しやすい形です
同じデータを「表」ではなく アセット単位 で持ちたくなったら、Data Asset が次の選択肢です。行の形そのものを見直したくなったら 構造体 へ戻ってください。
おまけ:先に知っておくと良いこと
CSVはプロジェクト内に置いておくと管理が楽です。 Content/Data/CSV のようなフォルダを作って原本を置いておけば、Gitで差分も追えます。ただ し Content 直下に置くとUEがアセットとして扱おうとするので、置き場所は決めておくと事故が減ります。
行の一覧を取れます。 Get Data Table Row Names を使うと、表に入っている全Row Nameが配列で返ります。「ランダムな敵を出す」「図鑑に全項目を並べる」といった処理は、これが起点になります。
Data Tableは実行中に書き換えるものではありません。 あくまで 設定値の置き場所 です。「現在のHP」のように変化する値は、読み込んだあとBlueprint側の変数で持ちます。実践で Health を CurrentHealth に写しているのはそのためです。
構造体を変えると、表の中身が飛ぶことがあります。 項目を追加・削除すると、入れたデータがリセットされる場合があります。 変更前にCSVへエクスポート しておけば、崩れても戻せます。右クリック → Export で書き出せます。
まとめ
Data Tableを使うときに押さえる点は、この4つです。
| 観点 | 結論 |
|---|---|
| 前提 | 構造体が先 。Row Structureは後から変えられない |
| キー | Row Name で行を引く。大文字小文字を区別 |
| CSV | 1列目がキー、1行目が変数名と完全一致、 BOM付きUTF-8 |
| 最大の注意 | 見つからなくても エラーにならない 。Found Row で分岐する |
そして設計の指針が1つ。 仕組みは1つ、数値は表 です。敵の種類ごとにBlueprintを増やすのをやめると、調整も修正もぐっと楽になります。
いま調整のたびに開いているBlueprint、その数値は表に出せませんか?