執筆: “Y.Y”
はじめに
イベントディスパッチャーをご存じでしょうか?
カスタムイベントの右上の赤い四角は何だろうと思った方もいらっしゃると思います。
今回はカスタムイベントの右上の赤い四角デリゲートをする方法の1つイベントディスパッチャーについてご紹介しようと思います。
この記事の内容
1. ファイルを用意しよう
2.デリゲートとは?
3. イベントディスパッチャーとは?
4.イベントディスパッチャーの使い方
5.イベントディスパッチャーノード説明
6.バインドする方法と条件
7.実装してみよう
8.まとめ
ファイルを用意しよう
今回必要なファイルは1種類です。
- UnrealEngine5.3
今回はサンプルのFirstパーソンを使用します。
プロジェクト名の指定はありません。

デリゲートとは?
デリゲートとは、「Aが○○したらBに知らせて、Bが何か処理を行う」といった仕組みのことです。
ここで疑問に思うかもしれません。「関数やイベントを直接呼び出せばいいのでは?」と。
確かに、処理の中で関数(やイベント)を直接呼び出す方法もあります。しかしその場合、呼び出す側(A)が、呼び出される側(B)の存在を知っていなければなりません。また、呼び出すかどうかを切り替える場合は、何らかのフラグや条件で管理する必要が出てきます。
一方、イベントディスパッチャーを使えば、AがBを直接知っている必要はありません。処理の流れの中で「○○が起きた」という通知を発信するだけで、それを受け取った側(B)が自由に反応することができます。
さらに、イベントディスパッチャーは動的に接続や切断が可能です。そのため、特定の条件で処理を実行するかどうかを、わざわざフラグなどで管理する必要がなくなります。
イベントディスパッチャーとは?
イベントディスパッチャーをCallすることで紐づけられている関数やカスタムイベントを発火することができます。
メリット
- 一度に複数の関数を呼び出せる
たとえば、アクターAの変数 Int_A が変更されたことをアクターB〜Mに通知したい場合、通常の関数呼び出しで処理を書くと非常に長く複雑なコードになります。イベントディスパッチャーなら、通知するだけでそれぞれの処理を自動的に実行できます。 - 処理の順番に縛られない
関数を順に呼び出す場合、前の処理が終わるまで次の処理が実行されません。イベントディスパッチャーなら、並列的に処理が進むため柔軟です。 - 参照を持たなくてよい
イベントディスパッチャーでは、呼び出す側が呼び出される側の参照を持っている必要がありません。これにより依存関係が少なくなり、疎結合な設計が可能になります。 - 単体での機能開発がしやすい
例えば「キャラクターのHPを別のアクターで監視する」といった場合、キャラクターの側でイベントディスパッチャーを用意し、それを監視側がバインドすれば、両者を独立して開発できます。 - 発火させたくない場合はバインドを切ることができる
状況に応じて「通知したくない」場合は、バインドを解除(Unbind)することで柔軟に対応できます。
デメリット
- 返り値を返すことができない
イベントディスパッチャーは通知を送るだけの仕組みであり、バインドされた関数からの戻り値を受け取ることはできません。 - 処理の流れを追いにくい
複数の関数がどこで呼ばれているのかがコード上に明示されていないため、処理の流れを追うのが難しくなることがあります。特に規模が大きくなると注意が必要です。
イベントディスパッチャーの使い方
イベントディスパッチャーは返り値を取得できないため、主に「通知目的」で使われます。
たとえば、キャラクターのHPを複数のアクターやウィジェットが参照している場合を考えてみましょう。このとき、返り値を受け取ったり、処理の完了を待つ必要がないのであれば、イベントディスパッチャーを使って「HPが変更された」という通知を送ることで、すべての参照先に一斉に処理を発火させることができます。
このように、ある出来事をきっかけに複数のオブジェクトに通知したい場合、イベントディスパッチャーは非常に有効な手段です。
イベントディスパッチャーのノード説明
ここではイベントディスパッチャーをバインドしたりアンバインドするためのノードを説明していきます。
- 呼び出す
イベントディスパッチャーをCallするノードのを配置する
CallするとBindされているイベントや関数が発火する - バインド
コールされた際に発火させるイベントや関数を紐づける - バインドを解除
イベントディスパッチャーに紐づけられているイベントを指定して解除する - イベント
イベントディスパッチャーに対して紐づけることのできるCustomEventを作成する
InputはイベントディスパッチャーのInputと同じになる

- 割り当て
イベントディスパッチャーのBindの呼び出しと紐づけることのできるイベントを作成する
紐づけるための条件
- 変数名:一致無くてもよい
- 型:一致する必要あり
- 変数の並び:一致必要あり
バインドする方法と条件
紐づけるための条件
- 変数名:一致無くてもよい
- 型:一致する必要あり
- 変数の並び:一致必要あり
Bindする方法
- 直接イベントを紐づける
Bindノードの左下の赤い四角(デリゲート)からラインを伸ばしてイベントの右上の赤い四角(デリゲート)に接続する
※この方法はBindするBPとEventが同じBPである必要がある
※関数はできないEventのみ - イベントや関数を指定してBindする
BindノードのデリゲートからCreateEventを作成する
1.CreateEventにに表座されているBindすることのできる関数やイベントを選択
2.一致する関数の作成またはイベントの作成を選択する
紐づけるのことのできるイベントや関数が作成される
※2はBindするBPの中で生成されるためほかのBPの関数に紐づけたい場合は使用できない
実装してみよう
Hitした数をカウント、イベントディスパッチャーを使用してHit数を表示するアクターを作成していきます。
アクターの作成


作成したアクターを開く
スタティックメッシュコンポーネントを追加する
名前をDummyMeshに変更

詳細からスタティックメッシュを設定
今回はSM_Cilinderを選択
イベントディスパッチャーの作成
マイブループリントのタブ→イベントディスパッチャーから作成

イベントディスパッチャーの設定
関数などと違いビューポート上から設定をすることはできない
設定は右側の詳細タブから設定をする
マイブループリントタブの
イベントディスパッチャー→設定したいイベントディスパッチャーを選択

インプットの設定
インプット右の+から追加
今回はこのアクターがHitした数を通知するイベントディスパッチャーを作成する

ヒットイベントを追加しHitした数カウントし通知するコードのを作成

通知を受け取るコードの作成

バインド

テストしてみよう
コンテンツブラウザからレベル上にドラッグして配置


まとめ
今回はイベントディスパッチャーの使い方の説明をしました。
イベントディスパッチャーを使いこなすことでプログラミングに幅を持たせることができます。
メリットとデメリットを正しく理解して関数やイベントなどと使い分けていきましょう。