デリゲートとイベントディスパッチャーの仕組み
妹「カスタムイベントをバインドしようと思うと、ちらほら"デリゲート"って単語が出てくるんだけど、これは何なの?」
「沢山の関数を登録して、それを後から呼び出して実行するやり方のこと。UE4のブループリントの場合は関数じゃなくてカスタムイベントだから、そのカスタムイベント自体のこともそういうかも」
妹「じゃあ、こういう場合のデリゲートの互換性っていうのはどういう意味?」
妹「なんというか、カスタムイベントの中にも、線がつながるのとつながらないのがあったんだよ。駄目なやつは互換性がどうのこうのといわれる」
「あー、それは多分、使いたいカスタムイベントと、バインドされる予定地の方で、ピンの数が違うからだね」
「デリゲートに使うカスタムイベントは、入力ピンの種類と並びが一致してないといけない。もちろんピンの数もだけど。そこにバインドした側のパラメータが送られてくるから。順番が固定になっているから、バインドする時にいちいち個別のピンをつながなくてもいいとも言えるけど」
妹「でも要らないピンもあるんだけど。色んなとこにバインドしたいのもあるし……」
「一番おすすめなのは、バインドする時に、赤い四角ピンからドラッグしてカスタムイベントを作る方法。これだとピンの名前も標準のを付けてくれるし、並びもバッチリのが出来るから簡単。そのイベントから別のイベントを呼び出す場合には、ピンの並びとか気にしなくていいし」
妹「イベントディスパッチャーというのもあるよね?」
「これは標準の、ダメージとかコリジョンとかのイベントとは別に、自分でデリゲートを使った仕組みを作る方法だね。アクター側の色んなところにイベントディスパッチャーの呼び出しを入れておくと、後から動作を追加出来る」
妹「でもやっぱりActorクラスを継承したやつに追加しても、Characterクラスにはそのイベント無いんだよね……」
「ないね……。それをやるにはActorのC++コードを書き換えるレベルまでやらないと駄目だけど、そこまでやるとUE4のバージョンアップの時の対応が大変だから、C++使う作業の中でもかなりめんどくさい部類に入る」
妹「なんとかコンポーネントくっつけるだけで済ませたかったんだけど」
「一応かなりの数のイベントが標準で入ってるし、コンポーネントから別のコンポーネントの状況を調べることも出来るから、大抵のことは出来そうな気がする」
妹「他のコンポーネントの状況を調べる?」
「先日のHoverの動画でも、最初に同じアクターに存在するPrimitiveComponentを探してるでしょ。その要領で、例えばコンポーネントAにイベントディスパッチャー作って、そこにコンポーネントBのイベントをバインドしたりっていうのは出来るから。コンポーネント側だけでかなりのことが出来そう」