【Unreal Engine】Data Assetで敵やアイテムをデータ駆動で作る方法

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

Data Assetの作り方と使いどころを図解。Blueprintだけで作る手順、Data Tableとの使い分け、1つのBP_Enemyで全種類の敵を作る実践、Primary Data Assetによる非同期ロードまで。

敵キャラを1種類増やすたびに、BP_Enemy を複製して、メッシュを差し替えて、HPを打ち直す。3種類のうちは気になりませんが、20種類になると、共通の修正をかけるだけで20回同じ作業をすることになります。

Data Tableで数値を外に出すのが第一歩ですが、敵の定義には数値以外も入ります。スケルタルメッシュ、待機アニメーション、ドロップアイテムの配列。表に並べて編集するには重い情報です。ここで使うのが Data Asset です。この記事では、Blueprintだけで作る手順から、1つの BP_Enemy で全種類の敵を動かす実践、Primary Data Assetによる非同期ロードまでを解説します。

1枚の設計図カードから、ゴブリン・オーク・ドラゴンの3体が生まれる。Data Assetのイメージ

この記事でわかること

  • Data Assetの正体= 中身を自分で決められる、データ専用のアセット
  • C++なしで作る手順(親クラスに Primary Data Asset を選ぶ)
  • Data Tableとの使い分けは 「1件ずつ開くか、表で並べるか」 で決まる
  • 実践: 1つの BP_Enemy で20種類の敵 を成立させる
  • Primary Data Asset で必要になってから読み込む

Sponsored

Data Assetとは:中身を自分で決められる入れ物

Data Assetは データだけを持つアセット です。Actorのように配置することも、動くこともなく、コンテンツブラウザに置かれた1つのファイルとして値を保持します。

普通のアセットと違うのは、 中身の項目を自分で定義する 点です。テクスチャなら「画像」と決まっていますが、Data Assetは「HP・攻撃力・使用するメッシュ・ドロップ品リスト」のように、必要な項目を自分で並べて型を作ります。作った型に対して、DA_GoblinDA_Orc のような実データを何枚でも作れます。

Data AssetBlueprint Class(Actor等)
持つものデータだけロジックとデータ
ワールドへの配置しないする(配置・スポーン)
増やすときのコストアセット1枚(数値の入力だけ)クラス1つ(グラフの複製が伴う)
向いているもの敵の定義、アイテム定義、設定値プレイヤー、ドア、ウィジェット

敵20種類をBlueprint Classで作ると、 ロジックも20個に増えます 。共通の挙動を直したいとき、20個を開くことになります。Data Assetなら、ロジックは BP_Enemy の1つだけで、増えるのはデータのアセットだけです。

左:BPを複製すると同じロジックが20個に増える。右:ロジックは1つで、増えるのはデータカードだけ
Sponsored

Blueprintだけで作る

Data AssetはC++の機能として説明されることが多いのですが、 Blueprintだけで完結します 。手順は「型を作る」「データを作る」の2段階です。

手順1:型を作る(親クラスに Primary Data Asset を選ぶ)

コンテンツブラウザで右クリックし、 Blueprint Class を選びます。親クラスの選択ダイアログで 「All Classes」を開き、PrimaryDataAsset を検索して選択 してください。

ここが最初のつまずきどころです。検索欄に DataAsset と打つと Data Asset も出てきますが、 こちらは選べませんUDataAsset はBlueprint化が許可されていないクラスだからです。Blueprintで型を作る場合は、その派生である PrimaryDataAsset を親にします。

名前は BPDA_EnemyDefinition のように、型だとわかる形にしておきます。開いて、必要な変数を追加します。

変数名用途
DisplayNameText画面に出す名前
MaxHealthFloat最大HP
AttackPowerFloat攻撃力
EnemyMeshSkeletal Mesh(オブジェクト参照)見た目
AnimClassAnim Instance(クラス参照)動き
DropItemIDsName(配列)ドロップ品のID

すべての変数で 目のアイコンを開いて「Instance Editable」をオン にします。ここがオフだと、データを作ったときに値を編集できません。最後に Compile と Save を忘れないでください。保存していない型は、次の手順のリストに出てきません。

補足: 下の3行が、Data Assetの使いどころです。メッシュやアニメーションBPへの 参照 、そして 配列 を、1件の定義の中にそのまま並べられます。

手順2:データを作る

コンテンツブラウザで右クリックし、 Create Advanced Asset > Miscellaneous > Data Asset を選びます(UIによっては Create Advanced Asset が展開済みで、 Miscellaneous > Data Asset と表示されます)。クラスを選ぶ画面が出るので、作った BPDA_EnemyDefinition を選択すると、その型のデータが1枚できます。

DA_GoblinDA_OrcDA_Dragon のように名前を付けて、それぞれをダブルクリックして値を入れていきます。ここから先は 表に数字を入れる作業 なので、プログラマー以外でも進められます。

型を1つ作り、そこからDA_Goblin・DA_Orc・DA_Dragonの3枚のデータを作る流れ
Sponsored

Data Tableとの使い分け

どちらもデータを外に出す仕組みなので、迷いやすいところです。判断の軸は 1件ずつ開いて編集したいか、表で並べて編集したいか です。

Data AssetData Table
1アセットの単位1件(DA_Goblin で1体分)複数行(1枚に100行)
アセット参照・配列得意(項目として自然に並ぶ)持てるが、行の中に収めると編集しづらい
一覧して比較するしづらい(1枚ずつ開く)得意(表で並ぶ)
CSVでの一括編集できないできる
向いているもの敵・ボス・スキルの定義ステータス表、テキスト、レベル別の係数

敵の定義はData Asset、レベル別のステータス表はData Table 。この2つは競合せず、組み合わせられます。たとえば DA_Goblin に「参照するステータス表の行名」を持たせて、実際の数値はData Tableから引く、という設計もよく使われます。

なお、Data Tableの行構造体にもアセット参照や配列は定義できます。持てないわけではなく、 1マスに収まらない情報を表形式で編集するのがつらい という違いです。

判断に迷ったら、 CSVで開いて嬉しいか を考えてください。100行を並べて数字を眺めたいならData Table、1件ごとにメッシュやエフェクトを紐づけたいならData Assetです。

Sponsored

実践:1つのBP_Enemyで20種類の敵を作る

冒頭の「敵を増やすたびにBPを複製する」を、Data Assetで解消します。RPGのザコ敵、ローグライクの階層別モンスター、タワーディフェンスの侵攻ユニット。「見た目と数値だけが違う同じ仕組み」は、どのジャンルにもあります。

完成形

BP_Enemy は1つだけ。レベルに配置するときに どのData Assetを使うかを指定する と、その敵になります。

レベルに3体のBP_Enemyを置き、それぞれにDA_Goblin/DA_Orc/DA_Dragonを指定すると、見た目もHPも変わる

再現条件

BP_Enemy(親は Character)に、次の変数を用意します。

変数名初期値設定
EnemyDataBPDA_EnemyDefinition(オブジェクト参照)なしInstance Editable をオン
CurrentHealthFloat0.0

EnemyData の Instance Editable が要点です。これをオンにすると、 レベルに置いた個体ごとに 詳細パネルからData Assetを差し替えられます。オフのままだと全個体が同じ敵になってしまいます。

Data Asset側には、3体分のSkeletal Meshと、それぞれに対応するAnimation Blueprintを設定しておきます。このとき メッシュとAnimBPのSkeleton(骨格)が一致している 必要があります。別のSkeletonを指定すると、見た目は出るのにアニメーションが動かない状態になります。

BeginPlayで自分を組み立てる

配置後、BeginPlayで EnemyData を読んで、自分の見た目とステータスを設定します。

BeginPlayからIs Validで分岐し、有効ならメッシュ・AnimClass・HPを順に設定するBlueprintノードグラフ
BP_Enemy
Event BeginPlay
  → Is Valid(Input Object: EnemyData)
      Is Valid ピン →
        Set Skeletal Mesh Asset(Target: Mesh, New Mesh: EnemyData → Enemy Mesh)
        → Set Anim Instance Class(Target: Mesh, New Class: EnemyData → Anim Class)
        → Set Current Health(Value: EnemyData → Max Health)
      Is Not Valid ピン →
        Print String(Append: "EnemyData 未設定 → " + Get Display Name(Self))

Is Valid を通すのは、Data Assetの指定を忘れた個体があると、その先で Accessed None のエラーが出るためです。Print Stringには Get Display Name(Self) を繋いでおきます。こうすると「どの個体が未設定か」まで表示されます(→ デバッグの記事)。

なお Set Skeletal Mesh Asset は、UE5.0以前では Set Skeletal Mesh という名前でした。古い解説記事と食い違ったときは、この改名を思い出してください。

確認する

3体を配置し、それぞれに別のData Assetを指定してPlayします。 見た目が3種類に分かれ、CurrentHealth がそれぞれの MaxHealth(たとえば 50 / 120 / 800)になっていれば成功 です。

HPの値は画面からは見えないので、Set Current Health の直後に Print String を繋いで数値を出すか、PIE中に対象のActorを選んで詳細パネルで確認してください。見た目が変わるのはPlay開始後です。エディタ上でData Assetを差し替えても、停止中の見た目は変わりません。

見た目が変わらない場合は、EnemyData の Instance Editable がオフのまま全個体が同じ値を見ている可能性が高いです。HPが0のままなら、Set Current Health の接続か、Data Asset側の MaxHealth が未入力です。

ポイントは2つです。

  • ロジックはBPに、値はData Assetに: BP_Enemy には「Data Assetを読んで自分を設定する」という手順だけを書きます。21種類目を追加する作業は、データを1枚作ることに変わります
  • Instance Editableで個体差を出す: Data Assetへの参照をInstance Editableにしておくと、レベル上で差し替えられます。この一手間がないと、せっかく分離したデータを個体ごとに割り当てられません

同じ考え方は敵以外にも効きます。武器、スキル、ステージ設定。「増えるもの」を見つけたら、ロジックとデータを切り分けられないかを疑ってみてください。

Sponsored

Primary Data Assetと非同期ロード

ここまでの作り方には、規模が大きくなると効いてくる問題があります。Data Assetを参照すると、 参照先のメッシュやアニメーションも一緒にメモリへ読み込まれます 。敵20種類を登録すると、序盤の草原マップでもドラゴンのメッシュが読み込まれる、という状態になりがちです。

全部を最初から抱えると重い。必要になった敵だけを読み込む

手順1で親に選んだ PrimaryDataAsset は、この制御の土台になります。Primary Data Assetは Asset Managerが1件ずつ認識できる 形式で、「どのData Assetがあるか」をエンジンが把握できるためです。

有効にするには、 Edit > Project Settings > Game > Asset Manager > Primary Asset Types to Scan に型を登録します。ここで対象のBase Classと、走査するDirectoriesを指定します。Blueprintで作った型を登録する場合は Has Blueprint Classes をオン にしてください。

読み込みを遅らせる

登録しただけでは読み込みは変わりません。 参照の持ち方をソフト参照に変える ことで、初めて「必要になるまで読み込まない」状態になります。

変数変更前変更後
EnemyMeshSkeletal Mesh(オブジェクト参照)Skeletal Mesh( Soft Object Reference
AnimClassAnim Instance(クラス参照)Anim Instance( Soft Class Reference

ソフト参照が保持しているのは実体ではなく アセットの場所(パス) です。そのため、そのまま Set Skeletal Mesh Asset へ繋ぐことはできません。 Async Load Asset ノードを挟み、Completed から返ってきたオブジェクトを渡す形に変えます。

Event BeginPlay
  → Async Load Asset(Asset: EnemyData → Enemy Mesh)
      Completed →
        Set Skeletal Mesh Asset(New Mesh: Loaded Asset をキャスト)

ひと手間増えるので、導入は段階的で構いません。まずはここまでの作り方で設計を整え、 読み込み時間やメモリが問題になってから ソフト参照へ切り替える順番が現実的です。ソフト参照と Async Load Asset の仕組みそのものは ソフト参照と非同期ロード で詳しく扱っています。

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

  • 命名は DA_ で統一する: 型は BPDA_、データは DA_ のように分けておくと、コンテンツブラウザで迷いません(→ アセット管理の記事
  • Data Assetにロジックを書かない: これはエンジンの制約ではなく、運用の方針です。Data AssetにもFunctionは追加できますが、判定や計算を持たせ始めると、どこに何が書いてあるかが再び散らばります。データの入れ物として保つと長持ちします
  • 実行中に生成するものではない: Data Assetはエディタ上で作って保存するアセットです。実行中に生成して値を持ち回りたい場合は、Structや通常のObjectを使います
  • C++で型を定義する選択肢もある: チームにプログラマーがいる場合、型を UDataAsset 派生のC++クラスで定義し、データはエディタで作る分担が組めます。書き方はBlueprintからC++への第一歩を参照してください
// EnemyDefinition.h — C++で型を定義する場合
// BlueprintType: BPで変数の型として使える / Blueprintable: BPで継承できる
UCLASS(BlueprintType, Blueprintable)
class MYPROJECT_API UEnemyDefinition : public UDataAsset
{
    GENERATED_BODY()

public:
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Enemy")
    FText DisplayName;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stats")
    float MaxHealth = 100.0f;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visual")
    TObjectPtr<USkeletalMesh> EnemyMesh;
};

まとめ

  • Data Assetは 中身の項目を自分で決められる、データ専用のアセット 。ロジックは持たせない運用にする
  • Blueprintだけで作れる 。親クラスは Data Asset ではなく Primary Data Asset 。変数の Instance Editable をオンにする
  • Data Tableとの分かれ目は 1件ずつ開くか、表で並べるか 。敵の定義はData Asset、ステータス表はData Table
  • 実践の要は ロジックはBPに1つ、値はData Assetに複数 。増やす作業がデータの追加に変わる
  • 読み込みが重くなったら Asset Managerへの登録+ソフト参照 で、必要になってから読み込む

プロジェクトの中で、いま複製が増え続けているBlueprintはどれでしょうか。そのクラスの変数一覧が、そのままData Assetの設計図になります。