ブループリントには、とても便利な仕組みとしてイベントディスパッチャーと呼ばれるものがあります。
イベントディスパッチャーというのは自由に定義を行い、自由なタイミングで違うブループリント同士の間でイベント発生させることのできる仕組みです。これを使うことによって、ブループリントのイベントを他の別のブループリント上で処理させるといったことが可能になります。
更にイベントディスパッチャーは一度の同じ呼び出し方法で全く別のロジックを呼び出しするといったことが可能になります。同じイベントでもブループリントによって違うことをさせたいといった時に便利なものです。
イベント発生元を作る
まずはイベントの発生元を作りましょう。名前は適当でもいいので、新規ブループリントを作成します。継承元はなんでもいいのですが、今回は適当にActorを継承させたクラスを作ります。今回このブループリントの名前は"EventSend_BP"という名前にしておきます。そしてイベントの受信元のブループリントも同様の方法で作ります。名前は"EventReceive_BP"にしておくとします。
次にEventSend_BPの方でイベントを作成するためにコンポーネントにBoxコンポーネントを追加しておきます。その状態でひとまず、作成したブループリントを2つとも配置しておきます。
※注意 EventReceive_BPは見た目がないので、レベル上に配置しても変化がない
そしてBoxコンポーネントに"OnComponentBeginOverlap"のイベントを追加しておきます。
これが今回のイベントの発生元となります。もちろんこのイベントじゃなくても自由なタイミングで発生させられるので、トリガーとなるイベントは自分で設定してみてください。
イベントディスパッチャーの作成
マイブループリントタブにある"イベントディスパッチャー"の追加ボタンを押してイベントディスパッチャーを追加します。デフォルトではタブのエリアが狭い状態でボタンが見えていない可能性が高いので、少しサイズを広くしてあげましょう。
イベントディスパッチャーの名前はわかりやすく"TestEventDispatcher"とします。
これであとはイベントディスパッチャーのコールノードを呼んであげます。
右クリックから"TestEventDispatcherの呼び出し"もしくは"Call TestEventDispatcher"を選択してノードを呼び出します。そしてBoxのOverlapイベントと繋ぎます。
最後のPrint Stringは確認用です。なくても構いません。ここまでの作業は全てEventSend_BP上での作業です。
イベント受信元の設定
今度はイベントの受信元の方を編集します。EventReceive_BPと名付けた方です。そして新規の変数を作成します。
変数タイプをEventSend_BPタイプにしておきます。更に変数名の右側にある目のアイコンをチェックして目が開いている状態にしておきます。これでこの変数を外部から設定できるようになります。
次に今度はブループリントのウィンドウからレベルエディターのウィンドウに戻り、配置しているEventReceive_BPを選択した状態にして、"Default"の中で変数の中に設定するアクターを指定します。
これで受信側から送信されてくるイベントの発生元が特定できるようになりました。
次にイベント受信用のブループリントを組みます。
Event Send BPの変数をグラフ上に取得(Get)ノードとして配置して、そのノードから伸ばしてドロップした時に、"Assign TestEventDispatcher"を選択します。
これで自動的にイベントのバインドとカスタムイベントの作成が行なわれます。あとはEvent Begin Play時にバインドを行なうようにしておきます。バインドを必ず行なわないとイベントは呼び出されないので注意してください。
イベントを発生させてカスタムイベントの呼び出しを行なう
これでイベント発生元となるBoxの中に侵入すれば、カスタムイベントがイベントディスパッチャーとして呼び出されるはずです。
まず受信側のイベント処理が行なわれてその後、送信側に処理が戻っているのがわかると思います。
レベルブループリントでも受信してみる
更にここからレベルブループリントでも同様に受信できるようにしてみます。
レベルブループリントではレベルエディターのビューポート、もしくはシーンアウトライナー内で送信側のアクターを選択した状態で、右クリックから対象のアクターのリファレンス(参照)を追加することができます。
これでEventReceive_BPと同様に送信側を参照することができるようになりますので、同じようにブループリントを組みます。
この状態になれば、レベルブループリントでも、その他のブループリントでも同様にイベントディスパッチャーを使って同じイベントでも別々の流れとしてディスパッチ(割り振り)することができるようになります。
と、いった具合にイベントディスパッチャーはイベントを発生させてそれぞれに全く別のことをさせてみたり、レベルブループリントとクラスブループリント間の通信にも役立ったりします。
使い方は様々ですが、非常にスマートなイベント処理ができるということがわかったと思います。