再利用性が重要な理由
Unreal Engine(UE)でゲーム開発を進めていると、複数のキャラクターやオブジェクトに共通の機能 を持たせたい場面に頻繁に遭遇します。
このような共通の振る舞いを、それぞれのActorのBlueprint内で個別に実装していくと、以下の問題が発生します。
- コードの重複: 同じロジックを何度も書くことになり、開発効率が低下します。
- 修正の困難さ: 仕様変更時にすべてのActorのBlueprintを修正する必要があり、ミスが発生しやすくなります。
- 複雑性の増大: 一つのBlueprintが肥大化し、管理が困難になります。
これらの課題を解決するための鍵となるのがBlueprint Component です。
Blueprint Componentとは
Blueprint Componentは、特定の機能や振る舞いをカプセル化(ひとまとめに)するためのモジュールです。
Unreal Engineにおける基本的なオブジェクトの階層は「Actor」が基本ですが、Actorはそれ自体が持つ機能だけでなく、複数のComponentをアタッチすることで、その機能を拡張します。例えば、StaticMeshComponentは見た目を、MovementComponentは移動の振る舞いをActorに提供します。
| 特徴 | Actor | Component |
|---|---|---|
| 役割 | ワールドに配置されるオブジェクトの基本単位 | Actorに機能や振る舞 いを追加するモジュール |
| 単体での存在 | 可能(ワールドに配置できる) | 不可能(必ずActorにアタッチされる) |
| 再利用性 | 継承による再利用が主 | 複数のActorへのアタッチによる再利用が主 |

Blueprint Componentの最大の利点 は、一度作成すれば、継承関係にない** 全く異なる種類のActor** に対しても、その振る舞いを簡単に組み込める点にあります。
再利用可能な体力システムComponentの作成
ここでは、具体的な例として、あらゆるActorにアタッチできる再利用可能な「体力システム」をBlueprint Componentとして実装する手順を解説します。
ステップ1: Blueprint Componentの作成
コンテンツブラウザで右クリックし、「Blueprint Class」を選択します。親クラスとしてActorComponentを選択し、名前をBP_HealthComponentとします。
💡 ActorComponentとSceneComponentの使い分け
親クラス 特徴 使用例 ActorComponent Transform(位置・回転・スケール)を持たない純粋なロジック用 体力管理、インベントリ、ステート管理 SceneComponent Transformを持ち、ワールド内に配置される カメラアーム、当たり判定、エフェクト発生点 体力システムのようなロジックのみ のComponentには
ActorComponentを、ワールド内の位置情報が必要 なComponentにはSceneComponentを使用します。
ステップ2: 変数とイベントの定義
このComponentが持つべきデータと機能(振る舞い)を定義します。
| 種類 | 名前 | 型 | 説明 |
|---|---|---|---|
| 変数 | MaxHealth | Float | 最大体力(Instance Editableに設定) |
| 変数 | CurrentHealth | Float | 現在の体力 |
| 関数 | ApplyDamage | Float入力(DamageAmount) | ダメージを適用し、体力を減らす |
| イベント | OnHealthChanged | Float出力(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へのアタッチと利用
- 体力を持たせたいActor(例:
BP_Enemy)のBlueprintを開きます。 - 「Components」パネルの「+ Add」ボタンから
BP_HealthComponentを検索し、アタッチします。 - 詳細パネルで
MaxHealthを任意の値(例: 100.0)に設定します。 - ActorのBlueprintのイベントグラフで、
BP_HealthComponentのOnDiedイベントをバインドし、敵を破壊するロジック(例:Destroy Actor)を実装します。
これで、BP_HealthComponentをアタッチするだけで、どのActorも共通の体力システムを持つことができました。
Component間の通信パターン
Componentを再利用可能にする上で最も重要なのは、ComponentがアタッチされているActor(Owner)や他の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_HealthComponentのApplyDamageを呼び出す)。 - 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化を試みてください。