【Unreal Engine】Data Table入門:敵の強さをCSVで調整し、Blueprintから読み込む

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

敵のHPと攻撃力を表にまとめ、CSVの変更をUnreal Engineへ取り込む手順を図解。構造体・Row Nameの役割から、Get Data Table Rowの成功・失敗の接続、ゴブリンのHPだけを変える実験まで解説します。

ゴブリンが少し弱いので、HPを60から90に増やしたい。敵ごとのBlueprintを開いて数値を探していると、ほかの敵とのバランスも比べづらくなります。

Data Table を使うと、敵の名前・HP・攻撃力を一つの表にまとめられます。Blueprintには「どの行を読むか」を指定しておき、数値の調整は表で進めます。Excelなどで編集したCSVを取り込めるので、敵が増えても数値を見渡しながら調整できます。

他のエンジンでいうと: 行の並んだ表データなので、Unity なら ScriptableObject で作ったデータベースや CSV / JSON の読み込み、Godot なら CSV や Resource の配列が近い使い方です。

この記事では、スライム・ゴブリン・オーガの表を作り、ゲーム開始時に読み込んだ値を文字で表示します。最後にCSVの1か所を変え、ゴブリンのHPだけが変わる ことを確かめましょう。

CSVでゴブリンのHPを変更し、同じBlueprintが変更後の値を読む

この記事でわかること

  • 構造体で表の項目を決め、CSVからData Tableを作る
  • 行の名前を指定して、1種類分のデータをBlueprintで読む
  • 行が見つからない場合も分けて確認する
  • CSVを取り込み直し、数値だけを変更する

Blueprintで変数とノードを作ったことがある人を想定しています。構造体の作成が初めてなら、構造体の入門記事も参考にしてください。

Sponsored

仕組み:構造体が項目、Data Tableが値を持つ

まず、これから作る表を見てください。

NameDisplayNameMaxHealthAttack
Slimeスライム305
Goblinゴブリン6012
Ogreオーガ20030

構造体(Struct) は、1個分の情報をまとめるための型です。今回は「表示名は文字、最大HPと攻撃力は整数」という、1行に入る項目を決めます。

Data Table は、その形に沿って実際の値を何行も並べたものです。ゴブリンもオーガも項目は同じで、中身の数値が違います。

構造体の3項目を列にして、Data Tableへ敵3種類の値を並べる

左端の Name は、読みたい行を指定するための名前です。UEでは Row Name(行名) と呼びます。Goblin と指定すれば、その行の「ゴブリン・60・12」がひとまとまりで取り出せます。行の並び順を覚えておく必要はありません。

NameDisplayName は役割が違います。前者はプログラムが探すための名前、後者はプレイヤーに見せる名前です。表示を「森のゴブリン」に変えても、行名を Goblin のままにしておけば、Blueprint側の指定は変えずに済みます。

準備:敵3種類の表を作る

1. 構造体で列を決める

コンテンツブラウザの右クリックから「Blueprints」→「Structure」を選び、S_EnemyStats を作ります。開いて、次の3項目を追加してください。

項目名意味
DisplayNameText画面に表示する敵の名前
MaxHealthInteger最大HP。ここでは小数を使わない
AttackInteger攻撃力

最初からある不要な項目は削除し、保存します。Name は構造体に追加しません。 行名はData Table側が持つためです。

2. CSVを用意する

CSV は、表の1行分をカンマで区切って書くファイル形式です。ExcelやGoogleスプレッドシートで編集できますが、今回はテキストエディタへ次を貼り付けても作れます。

Name,DisplayName,MaxHealth,Attack
Slime,スライム,30,5
Goblin,ゴブリン,60,12
Ogre,オーガ,200,30

プロジェクトのフォルダ内に SourceData フォルダを作り、EnemyStats.csv という名前で保存します。Content の外に、編集用の原稿を置く形です。文字コードはUTF-8を選んでください。Excelなら「CSV UTF-8(コンマ区切り)」形式で保存します。

1行目は 見出し(ヘッダー) です。Name の後には、構造体で付けた項目名をそのまま並べます。2行目以降が実際のデータで、1行に敵1種類分を書きます。

CSVの先頭列は行を探す名前、残りの3列は構造体の項目に対応する

3. CSVを取り込む

  1. コンテンツブラウザで、表を保存したいフォルダを開く。
  2. EnemyStats.csv をそのフォルダへドラッグ&ドロップする。
  3. 「Import As」を DataTable にする。
  4. 「Data Table Row Type」で S_EnemyStats を選び、取り込む。
  5. 作られたアセットを DT_EnemyStats に名前変更し、保存する。

Row Type は「この表の1行を、どの構造体の形として読むか」という指定です。「Import Key Field」の欄がある場合は空欄にします。この設定ではCSVの先頭列を行名として使います。項目の不足・余分を無視する設定は有効にせず、警告が出たら見出しと構造体を見比べてください。

CSVを読み込み、行の型にS_EnemyStatsを選んでData Tableを作る

DT_EnemyStats を開き、3行あるか確認します。Goblin の行で、表示名が「ゴブリン」、MaxHealth60Attack12 なら準備完了です。文字が崩れている場合は、CSVの文字コードを確認して保存し直します。

ここで作ったData Tableが、ゲームから読むアセットです。CSVはその編集元であり、これから作るBlueprintがPlay中にCSVを直接開くわけではありません。公式のCSV取り込み手順

Sponsored

実践:指定した行を読み、結果を表示する

同じBlueprintを3体置き、読む行だけを変えます。成功すると、「スライム: HP 30 / ATK 5」のように、敵ごとの値が表示されます。まずゴブリン1体で試し、その後に増やしましょう。

同じBlueprintでも、Slime・Goblin・Ogreのどの行を読むかで表示される値が変わる

図の人形は読み手となるActorのイメージです。この実践ではメッシュや移動処理を追加せず、文字の出力で確認します。

1. 読む行を選べるActorを作る

  1. 親クラスが「Actor」のBlueprint BP_EnemyDataDemo を作る。
  2. EnemyRowName という変数を作り、型を Name にする。
  3. 変数の「Instance Editable」を有効にし、コンパイルする。
  4. レベルへ BP_EnemyDataDemo を1体配置する。
  5. 配置したActorを選び、詳細パネルの EnemyRowNameGoblin と入力する。

Name型は、行名などの識別に使う名前の型です。「Instance Editable」を有効にすると、レベルに置いたActorごとに値を指定 できます。同じBlueprintを使っていても、1体は Slime、別の1体は Goblin と設定できます。

2. 行が見つかった場合と、見つからない場合を分ける

BP_EnemyDataDemo のイベントグラフで、Event BeginPlay から Get Data Table Row をつなぎます。BeginPlayは、このActorがゲーム内で動き始めるときに呼ばれるイベントです。

取得ノードの「Data Table」で DT_EnemyStats を選び、変数 EnemyRowName のGetを「Row Name」へ接続してください。

BeginPlayから行を取得し、Row FoundとRow Not Foundを別々のPrint Textへつなぐ

取得ノードには、次の出力があります。

出力役割
Row Found行が見つかったときに進む、白い実行ピン
Row Not Found行が見つからなかったときに進む、白い実行ピン
Out Row見つかった1行分の値。今回はS_EnemyStats

文字を画面に出す Print Text を2個置きます。「Row Found」から成功用へ、「Row Not Found」から失敗用へ白い線をつなぎ、失敗用の「In Text」には 行が見つかりません と入力します。成功用の表示内容は、次の手順で作ります。

成功・失敗は、この2本の実行線で分かれます。 Out Row の値は、行が見つかった経路で使います。Get Data Table Rowの公式API

3. 1行分の値を、読める文章にする

「Out Row」からドラッグして、Break S_EnemyStats を作ります。Break は、構造体のまとまりから各項目を取り出すノードです。「Display Name」「Max Health」「Attack」が読めるようになります。

次に Format Text を置き、「Format」に次を入力してください。

{Name}: HP {HP} / ATK {ATK}

{ } の部分が、値を差し込む場所です。入力すると「Name」「HP」「ATK」のピンが増えるので、Breakの3項目をそれぞれつなぎます。この図は値の接続を取り出したものです。左端の取得ノードは、前の手順で置いたものを使います。

Out RowをBreakし、表示名・最大HP・攻撃力をFormat Textの3か所へ差し込む
Breakの出力Format Textの入力
Display NameName
Max HealthHP
AttackATK

最後にFormat Textの「Result」を、成功用 のPrint Textの「In Text」へつなぎます。ゴブリンの行なら、ゴブリン: HP 60 / ATK 12 という文章になります。ここでの Name は表示用の差し込み名で、行を選ぶ EnemyRowName とは別です。

Format TextのResultを成功用Print Textへ渡し、Row Foundの実行線で表示する

BreakとFormat Textには白い実行ピンがありません。表示する値が必要になったときに計算するノードだからです。処理の順番はBeginPlay→行の取得→Print Textの白い線で決まり、色付きの線が表示内容を渡します。Format Textの公式API

2個のPrint Textは、どちらも「Print to Screen」と「Print to Log」を有効にし、「Duration」を 10 にします。詳細ピンが折り畳まれている場合は展開してください。「Key」は未指定(None)のままにします。

4. 正しい行・存在しない行の両方を試す

コンパイルしてPlayします。画面に ゴブリン: HP 60 / ATK 12 と表示されれば、表の1行を読めています。表示を後から確認したい場合は、エディタの「Output Log(出力ログ)」を開いてください。Print Textの「Print to Log」は、そのログへも文章を残す設定です。Print Textの公式API

一度Playを停止し、配置したActorの EnemyRowName を、表にない MissingEnemy に変えて試します。今度は 行が見つかりません と出れば、失敗経路も確認できました。確認後は Goblin に戻します。

続いてActorを2体複製し、3体の EnemyRowNameSlimeGoblinOgre に設定してください。再びPlayして、3種類の名前と数値が出ることを確かめます。出力順は問わず、各行の内容で照合します。

調整:CSVでゴブリンのHPだけを変える

ここからが数値調整です。Blueprintのノードはそのままで、EnemyStats.csv のゴブリンの行だけを変更します。

Name,DisplayName,MaxHealth,Attack
Slime,スライム,30,5
Goblin,ゴブリン,90,12
Ogre,オーガ,200,30
  1. Playを停止する。
  2. CSVの GoblinMaxHealth6090 に変え、同じファイルへ保存する。
  3. コンテンツブラウザで DT_EnemyStats を右クリックし、「Reimport」を選ぶ。
  4. 表を開き、GoblinMaxHealth90 になったか確認する。
  5. Data Tableを保存し、もう一度Playする。

Reimport(再インポート) は、最初に取り込んだ場所にあるファイルを読み直して、アセットの内容を更新する操作です。CSVの保存と、表の更新をセットで行います。公式の再インポート手順

CSVを保存し、Data TableをReimportしてからPlayするとゴブリンのHPが90になる

ゴブリン: HP 90 / ATK 12 と表示され、スライムはHP30、オーガはHP200のままなら成功です。読む処理を作っておけば、バランス調整のたびにノードを直す必要がなくなります。

表示が60のままなら、まずData Tableの表を確認します。表も60ならCSVの保存先や再インポートを、表が90ならPlayをやり直したかを確認してください。今回はBeginPlayで読むので、実行中にCSVを編集しても、表示処理が自動でもう一度動くわけではありません。

Sponsored

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

最大HPと、いま残っているHPは分ける

今回表示したのは、表に書かれた 種類ごとの初期設定 です。実際の戦闘では、読み込んだ MaxHealth を敵Actorの CurrentHealth などへ入れ、被弾したらそのActorの現在HPを減らします。

調整前の最大HP60を例に考えてみます。ゴブリンを2体出し、片方だけが10ダメージ受けたなら、現在HPは50と60です。ゴブリンという種類の最大HPを50に変更したいわけではありません。

種類の最大HPは表に置き、被弾で減る現在HPはそれぞれのActorが持つ

この分け方にすると、全ゴブリンの強さを調整する変更 と、目の前の1体がダメージを受ける変更 を混同せずに扱えます。現在HPを変数へ入れる処理や被弾処理は、戦闘側で追加します。

行名は、表示名とは別に安定させる

Goblin を別の行名へ変更すると、その名前を指定していたActorも修正が必要です。プレイヤーに見せる名前だけを変えたい場合は DisplayName を編集しましょう。

Row Nameに使われるName型は、大文字・小文字を区別しない比較をします。Goblingoblin を別種類の行名として使い分けることはできません。作業中の見間違いを減らすため、表とBlueprintでは同じ表記に揃えておくと追いやすくなります。Name型の公式説明

CSVとエディタ、どちらを編集元にするか決める

Data Tableはエディタ内でも値を編集できます。ただしCSVを再インポートすると、そのファイルの内容で表が更新されます。エディタでHP90にした後、古いCSVを取り込み直せば、意図せず60へ戻すことになります。

この記事の運用ではCSVを編集元にします。ファイルを移動した場合は、Data Tableが参照するインポート元も確認してください。既存の表をCSVへ移したいときは、Data Tableの「Export as CSV」でひな形を書き出すと、項目名を手で写す間違いを減らせます。

表の項目を変えるときは、値の調整と分けて確認する

HP60→90は、既存の項目の値を変える作業です。一方、構造体へ新しい項目を足したり、名前や型を変えたりすると、CSVの見出しやBreakノードにも影響します。変更前のファイルを残し、取り込み時の警告・表の値・利用しているBlueprintを確認しましょう。

数値を縦に並べて比較する用途にはData Tableが向いています。アイテムごとにメッシュや効果音などもエディタで選びながら設定したい場合は、Data Assetの使い方も合わせて見ると、データの置き方を選びやすくなります。

まとめ

  • 構造体が「表の項目」、Data Tableが「その値」を持つ
  • 行の名前を指定して読み、見つからない場合も分けて処理する
  • CSVを取り込み直せば、数値だけを差し替えられる

使う前の問いかけは、「同じ形のデータが、何行も並ぶか」 です。並ぶなら表、1件ずつ性質が違うならData Assetが向きます。

1件ずつ設定を持たせるなら Data Assetとデータ駆動設計、読んだ値を持ち歩くなら 構造体 へ進んでください。

Unreal Engine このセクションのノート98