🙄

【UE5】インターフェースクラスから通知を受け取りたい

2024/01/10に公開

インターフェース実装クラスに対しイベントディスパッチャーが使えない

インターフェース実装クラスから通知を受け取りたいことがありまして、でも相手はインターフェースなのでクラスの実体はわかりません。実体がわからないからイベントディスパッチャーが使えません。どうしたものかと色々考えて、いくつか案が浮かびました。

案1

インターフェースイベントの引数に呼び出し元のクラスを渡してしまう

インターフェースイベントに引数を設定し、引数に呼び出し元のクラスをオブジェクト参照でセットしてしまえば、インターフェース実装先でイベントの処理が終わったタイミングで引数から受け取ったオブジェクトに対し通知を送ることが可能になります。

案2

インターフェース実装クラスに通知用クラスを持たせる

インターフェース実装クラスに通知用クラスを持たせるだけで、インターフェース実装クラスから通知を受け取ることができるようになります。

大まかな流れは以下のようになっています。

  1. インターフェース実装クラスに通知用クラスを持たせます。
    インターフェース実装クラスの関数が呼ばれた際に、通知用クラスを渡します。

  2. 通知を受け取りたいクラスは、インターフェース実装クラスの関数から通知用クラスを取得します。
    取得した通知用クラスに実装されたイベントディスパッチャーに対してイベントをバインドさせます。

  3. インターフェース実装クラスが通知用クラスのイベントディスパッチャーをコールすることで通知を受け取りたいクラスへ通知が届きます。

実装例

通知用クラスの実装

  • イベントディスパッチャーのみを実装したObjectクラス(通知用クラス)を用意します。

インターフェースの用意

  • 関数を追加します。アウトプットに通知用クラスを設定します。
  • デバッグ目的で、トリガー用のイベントも追加しておきます。

通知する側のクラスの実装

  • BeginPlayで通知用クラスを変数にセットします。
  • 先ほど作ったインターフェースを追加します。
  • インターフェース関数(Get Obj)を実装します。通知用クラスをアウトプットピンに繋げます。
  • インターフェースイベント(Notify)を実装します。
    このイベントを通過してから3秒後にイベントディスパッチャーを実行させるようにします。

通知される側のクラスの実装

  • インターフェース関数(Get Obj)から通知用クラスを取得し、イベントをバインドさせます。
    その後、インターフェースイベント(Notify)を実行します。
  • 変数のActorにはインターフェース実装クラスが入っています。アウトライナー上から設定しました。

ゲーム実行

  • 無事呼ばれました。

おわりに

思いついたまま書いてみましたが、何か面白い使い道に繋がればと思っております。

Discussion