※この記事で使用しているUnrealのVersionは04.21.1です。

※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト

個人的に、InterdaceとDispatcherが似ていて、どのタイミングでどちらを使えばいいかが時々わからなくなります。

なのでこの際、2つの特徴を調べてそれぞれに向いている仕事を自分なりに研究しました。

Interfaceの特徴 レベル【★★☆】

Interfaceは、送信側の情報を知ることなく、受信側はイベントを受け取ることができるという大きな特徴があります。また、送信側も相手がいることさえわかればイベントを送信することが出来ます。

その特徴のおかげで、アセットやアクター同士の「依存度」を下げることが出来ます。

また、「Get All Actor With Interface」「Get All Widget With Interface」により、送信側が一方的に受信側の情報を知ることが出来ます。また、For分を使うことで、それらに一斉送信できます。

さらに、Interfaceには返り値のあるものも作成できるので、受信側の詳しい情報を知らずにInterfaceを送り、その返り値を勝手に使うこともできます。

Dispatcherの特徴 レベル【★★☆】

Dispatcherのイベントを受け取る際は、予めDispatcherを「バインド」しておく必要があります。
たとえ、Dispatcherを実装しているクラスのアクターが複数合ったとしても、バインドしているアクターからしかイベントを受け取ることが出来ないです。

ですが、送信側の一度の呼び出しで、バインドしていた受信側すべてのイベントを発行できます。また、送信側は受信側がいるいない関係なく呼び出し可能です。

また、必要なときにのみ「バインド」し、不要になったら「アンバインド」で参照を切る事もできます。

————————————————–

まとめると

Interfaceを使うときは、
・アクターやレベルの依存を避けたい。
・不特定多数にイベントを発行したい。
などのときにオススメです。

Dispatcherを使うときは、
・特定のアクターなどの特定のイベントを監視したい。
・同じクラスでも必要なやつだけイベントを受け取りたい。
などのときにオススメです。

というような感じです。

InterfaceとDispatcherを使った簡単な例 レベル【★★☆】

InterfaceとDispatcherを使った簡単な例を作ってみました

・レベルにあらかじめ作成しておいたBPアクターを3つ置いておく
・レベルにはInterfaceをセットしておく。
・LevelのTickで1秒毎にBPアクターのDispatcherにイベントを発行
・BPアクター内では、BeginPlayからランダムなDelay(5~10秒)後にDispatcherをバインドします。
・バインドされたDispatcherがCallされるとアンバインドされ、インターフェースを飛ばします。
・レベル側で受け取ったインターフェースは、その後MultiGateを通してPrintStringを処理します。

レベルBP

TickInterval

レベルにはInterfaceを実装

BPアクターの中身

レベルの中身(BPアクター3つ)

これを実行すると、
毎秒DispatcherはレベルBPから呼ばれていますが、バインドされるタイミングは各アクター1回でDispatcherのイベントが呼ばれてもすかさずアンバインドが走るため、それ以降DispatcherEventが走る事はありません。
また、DispatcherEventが呼ばれた後は、アクターからInterfaceを持っている場所を探して、底に向かって発信しています。
レベルBPでそれを受け取るとPrintStringが走るようになります。

こんな感じで、InterfaceとDispatcherを使い分けてみると、それぞれの向き不向きが見えてきて、それぞれの特徴を生かして開発をよりスムーズにできるかと思います。

※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト