見出し画像

UE5でイベントを発行する

要件

・UE上でアクターからアクターへのイベント実装方法を調べる
・赤と青のキューブそれぞれで火が点灯、消灯するものを作る
・マネキンさんが触れたら起動する

イベント送信方法が分かれば良いのでアバウト

まず赤と青のキューブを置く

これは簡単に
BP_FireCube,BP_AquaCubreを作成して適応に配置します
BP_Actionとして炎エフェクトを見えるところに配置

イベントディスパッチャーでの実装

イベントディスパッチャーという良さげな名前があるようなので使ってみる事に

参考にさせていただいた記事
https://zenn.dev/daichi_gamedev/books/unreal-engine-tutorial-2/viewer/blueprint2-eventdispatcher

BP_AquaCubeのBPからはディスパッチャ呼び出しを追加
消火するのでOnDisableFireで

受け取るBP_Action側では以下のように

イベントディスパッチャーを追加し、初期化時にバインドとしてカスタムイベントを作成
そのイベントが呼び出される想定でVisibilityを切り替える
EventSenderは公開変数にしてBP_AquaCubeを設定

これで青のキューブに触れると日が消えるようになる
めでたしめでたs

違う、そうじゃない

イベントディスパッチャー実装での問題

上記実装では個人的に非常に気になる所がある
受け取り側BPに「Cast To BP_AquaCube」がある事だ
これは変数として設定しているAquaCubeの型をBP上で直接指定しており
型が分かっている前提の実装になっている

メッセージ受け渡しとしては受け取れる実装をしてなかったら何もしないぐらい緩くしたい所
そうでないと管理下のアクターにメッセージを渡して後は任せる、という事が行いにくい

他の実装方法はないだろうか

BPインターフェース

素のC++やUnityC#ならIEventReceiverのようなインターフェイスを作成して継承したクラスはイベントを受け取れるというような事を行う
UEの事だから似たようなものがあるんじゃないかと思って調べてみたら、あった
BPインターフェイスというものがあるようだ

上記一番右にBPI_Fireというインターフェイスを作成してみた
BPインターフェイスというものは単純に関数宣言しかないBPのようだ
これをBPに複数追加でき、追加されたBPはその実装を行う

インターフェイス実装に改造

インターフェイスを使用した形に変えてみる
まずイベント発行側、非常にシンプル

相手が持っている筈のインターフェイス関数を呼び出すのみ
Targetは今回は公開変数にBP_Fireを直接設定したActor変数を指定している
これはインスタンスがわからないと関数を呼び出せないという話なので納得できる
実際はマネージャ系のBPが管理アクターのインターフェイス関数を呼び出す形になると思われる

次に呼び出される側はインターフェイスの追加と実装を行う
インターフェイスはBP画面の上にあるクラス設定を押すと右側に出てくる

ここで追加すると左にインターフェイス関数が追加される

これをダブルクリックするとBPに追加されるので実装を行う
やる事は下記の画像のように単純

これで青は消火、赤は点火になった

雑感

イベントディスパッチャーによる実装はいまいち使い所がピンとこない
インターフェイス実装は綺麗に受け取り側は実体の型を知らずにすむので基本こちらで良いのではないかと思う
これをできる事が確認できたのでアクター間のメッセージやりとりのイメージが掴めてきた


この記事が気に入ったらサポートをしてみませんか?