【Unreal Engine】Blueprint Componentで機能を再利用する設計パターン

作成: 2025-12-12

ActorComponentとSceneComponentの違い、再利用可能な体力システムの実装例、Event DispatcherやInterfaceを使ったComponent間通信のパターンを紹介。

再利用性が重要な理由

Unreal Engine(UE)でゲーム開発を進めていると、複数のキャラクターやオブジェクトに共通の機能 を持たせたい場面に頻繁に遭遇します。

このような共通の振る舞いを、それぞれのActorのBlueprint内で個別に実装していくと、以下の問題が発生します。

  1. コードの重複: 同じロジックを何度も書くことになり、開発効率が低下します。
  2. 修正の困難さ: 仕様変更時にすべてのActorのBlueprintを修正する必要があり、ミスが発生しやすくなります。
  3. 複雑性の増大: 一つのBlueprintが肥大化し、管理が困難になります。

これらの課題を解決するための鍵となるのがBlueprint Component です。

Blueprint Componentとは

Blueprint Componentは、特定の機能や振る舞いをカプセル化(ひとまとめに)するためのモジュールです。

Unreal Engineにおける基本的なオブジェクトの階層は「Actor」が基本ですが、Actorはそれ自体が持つ機能だけでなく、複数のComponentをアタッチすることで、その機能を拡張します。例えば、StaticMeshComponentは見た目を、MovementComponentは移動の振る舞いをActorに提供します。

特徴ActorComponent
役割ワールドに配置されるオブジェクトの基本単位Actorに機能や振る舞いを追加するモジュール
単体での存在可能(ワールドに配置できる)不可能(必ずActorにアタッチされる)
再利用性継承による再利用が主複数のActorへのアタッチによる再利用が主
ActorとComponentの関係

Blueprint Componentの最大の利点 は、一度作成すれば、継承関係にない** 全く異なる種類のActor** に対しても、その振る舞いを簡単に組み込める点にあります。

再利用可能な体力システムComponentの作成

ここでは、具体的な例として、あらゆるActorにアタッチできる再利用可能な「体力システム」をBlueprint Componentとして実装する手順を解説します。

ステップ1: Blueprint Componentの作成

コンテンツブラウザで右クリックし、「Blueprint Class」を選択します。親クラスとしてActorComponentを選択し、名前をBP_HealthComponentとします。

💡 ActorComponentとSceneComponentの使い分け

親クラス特徴使用例
ActorComponentTransform(位置・回転・スケール)を持たない純粋なロジック用体力管理、インベントリ、ステート管理
SceneComponentTransformを持ち、ワールド内に配置されるカメラアーム、当たり判定、エフェクト発生点

体力システムのようなロジックのみ のComponentにはActorComponentを、ワールド内の位置情報が必要 なComponentにはSceneComponentを使用します。

ステップ2: 変数とイベントの定義

このComponentが持つべきデータと機能(振る舞い)を定義します。

種類名前説明
変数MaxHealthFloat最大体力(Instance Editableに設定)
変数CurrentHealthFloat現在の体力
関数ApplyDamageFloat入力(DamageAmountダメージを適用し、体力を減らす
イベントOnHealthChangedFloat出力(NewHealth体力が変化したときに通知する
イベントOnDiedなし体力が0になったときに通知する

ステップ3: ダメージ処理の実装(ApplyDamage関数)

ApplyDamage関数内で、受け取ったダメージ量に基づいてCurrentHealthを更新し、0未満にならないようにクランプ(Clamp)します。

// ApplyDamage 関数内
// 1. CurrentHealthからDamageAmountを引く
// 2. 結果をMax(0, 結果)でクランプし、CurrentHealthにセット
// 3. OnHealthChangedイベントディスパッチャーを呼び出す
// 4. CurrentHealthが0以下になったら、OnDiedイベントディスパッチャーを呼び出す

ステップ4: Actorへのアタッチと利用

  1. 体力を持たせたいActor(例: BP_Enemy)のBlueprintを開きます。
  2. 「Components」パネルの「+ Add」ボタンからBP_HealthComponentを検索し、アタッチします。
  3. 詳細パネルでMaxHealthを任意の値(例: 100.0)に設定します。
  4. ActorのBlueprintのイベントグラフで、BP_HealthComponentOnDiedイベントをバインドし、敵を破壊するロジック(例: Destroy Actor)を実装します。

これで、BP_HealthComponentをアタッチするだけで、どのActorも共通の体力システムを持つことができました。

Component間の通信パターン

Componentを再利用可能にする上で最も重要なのは、ComponentがアタッチされているActor(Owner)や他のComponentに直接依存しない ように設計することです。

Componentの通信パターン

💡 ベストプラクティス:Event DispatcherとInterfaceの活用

ComponentからOwner Actorや他のシステムへ情報を伝えるには、Event Dispatcher(イベントディスパッチャー) を使用します。

  • Component → Owner Actorへの通知: BP_HealthComponentの例で使ったOnDiedのように、Component内で発生した事象をEvent Dispatcherでブロードキャスト(通知)します。Owner Actor側でこのイベントをバインドし、具体的な処理(死亡アニメーションの再生、ドロップアイテムの生成など)を実装します。
  • Owner Actor → Componentへの命令: ActorからComponentの関数を呼び出すのは問題ありません(例: BP_EnemyからBP_HealthComponentApplyDamageを呼び出す)。
  • Component → 外部システムへの命令: Componentが他のActorやシステムとやり取りする必要がある場合は、Blueprint Interface を使用します。これにより、特定のActorクラスに依存することなく、汎用的な命令(例: 「ダメージを与える」)を送信できます。

❌ よくある間違い:直接的なキャスト

Component内でGet Ownerノードから特定のActorクラス(例: BP_PlayerCharacter)に直接キャストし、そのActor固有の関数を呼び出すのは避けるべきです。

// ❌ 悪い例: 再利用性が失われる
// Component内でGet Owner -> Cast To BP_PlayerCharacter
// このComponentはBP_PlayerCharacterにしか使えなくなる

この設計では、Componentが特定のActorに強く依存してしまい、他のActorにアタッチしても機能しなくなります。再利用性を高めるためには、常に汎用的なActorComponentの視点 でロジックを構築することが重要です。

Blueprint Componentの設計原則

Blueprint Componentは、Unreal Engineにおける「振る舞いの再利用」を実現するための最も強力なツールの一つです。

要点説明
目的共通の機能や振る舞いをカプセル化し、コードの重複を防ぎ、メンテナンス性を向上させる。
設計原則Componentは、アタッチされるActorや他のシステムに直接依存しない ように設計する。
通信方法Componentから外部への通知にはEvent Dispatcher を、汎用的な命令にはBlueprint Interface を使用する。
活用例体力システム、インベントリ管理、特殊な移動ロジック、インタラクション判定など、様々な共通機能に適用可能。

Blueprint Componentを適切に活用することで、あなたのUnreal Engineプロジェクトはよりモジュール化され、大規模な開発にも耐えうる柔軟な構造へと進化するでしょう。まずはシンプルな共通機能からComponent化を試みてください。