「アイテムを拾ったら、インベントリを更新して、UIに通知して、SEを鳴らす」。素直に書くと、アイテムのBlueprintがインベントリとUIとサウンドを全部知っている状態になります。音の仕様を変えたいだけなのに、開くのはアイテムのBlueprintです。
この絡まりをほどく道具が Event Dispatcher です。アイテムは「拾われたよ」と ベルを鳴らすだけ で、誰が聴いて何をするかは聴く側が決めます。この記事では、Dispatcherの実装を「作る・登録する・鳴らす」の3拍子で解説し、Unbind忘れの事故と、C++でのデリゲート実装までを扱います。
この記事でわかること
- Dispatcherの本質= 発生源と処理者の完全な分離(Observerパターン)
- Blueprint実装の3拍子: 作る(Dispatcher)→ 登録する(Bind)→ 鳴らす(Call)
- Unbind忘れ が引き起こすクラッシュと、その防ぎ方
- C++の マルチキャストデリゲート(
BlueprintAssignable/AddDynamic)- 実践:アイテム取得の 通知網 を組む
なぜ必要か:名指しの連絡網は破綻する
Event DispatcherはUEにおける デリゲート(Delegate) の代表的な実装で、「イベントの発生を、関心のある全員に通知する」仕組みです。いわゆる Observerパターン にあたります。役割分担はこうなります。
| 役割 | すること | 知らないこと |
|---|---|---|
| 発生源(Caller) | ベルを鳴らす(Call) | 誰が聴いているか |
| 処理者(Listener) | ベルに登録する(Bind) | 発生源の中身 |
| Event Dispatcher | 両者を仲介するベル | 両者の中身(だから依存を断ち切れる) |

名指しの直接呼び出しでは、リアクションが1つ増えるたびに 発生源の修正 が必要です。Dispatcherなら、新しい聴衆がBindするだけで済み、発生源のBlueprintは一文字も変わりません。
実践:アイテム取得の通知網を組む
冒頭の「拾ったら3つが動く」を、実際に組んでみましょう。RPGの素材拾い、ローグライクの宝箱、シューティングのパワーアップ。「取得の瞬間に複数のシステムが反応する」構図は、どのジャンルでも同じです。実装は 3拍子 で進みます。

再現用の準備: レベルに BP_Item を1個、BP_InventoryManager を1個置きます。Managerには変数 TargetItem(BP_Item 型・ Instance Editable にチェック)を作り、レベル上のアイテムを指しておきます(Instance Editableにすると、レベルに置いた個体ごとに相手を指定できます → Blueprint変数入門)。この「1個ずつ手で指す」だるさを覚えておくと、後半のおまけで出てくる中央Dispatcherのありがたみが効いてきます。
拍子1:ベルを作る(Dispatcherの定義)
BP_Item のMy Blueprintパネル「Event Dispatchers」で OnItemPickedUp を作成します。引数(Inputs)は、作成したDispatcherを選択し、詳細パネルの Inputs 欄の「+」から追加します。聴く側が知りたい最小限の情報だけを載せます。ここでは拾ったプレイヤーの参照(Instigator)です。
拍子2:聴く人が登録する(Bind)
通知を受けたい側、たとえば BP_InventoryManager のBeginPlayで、アイテムの参照から Bind Event to OnItemPickedUp ノードを繋ぎ、Eventピンにカスタムイベントを接続します。
BP_InventoryManager(聴く側)
Event BeginPlay → Bind Event to OnItemPickedUp(Target: アイテムの参照)
Event ピン ← Custom Event: HandleItemPickup(Instigator を受け取る)
HandleItemPickup → インベントリへ追加 → UI更新
