妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ブループリントにおけるオーバーライド関数とイベントの違い

妹「オーバーライド関数も使うと色々出来るのはわかったけど、これイベントと何が違うの? 全部イベントでいいんじゃない? 関数よりわかりやすいし」

「色々眺めた感じだと、あんまり変わらないのかなって感じはする。例えばウィジェットのオーバーライド関数にOnMouseLeaveってあるんだけど、この関数をOnMouseMoveの時と同じ要領でオーバーライドしようとすると、何故か関数じゃなくて、イベントノードとして出てくるんだよ。ブループリント一覧にも出てくるから、そこから普通にイベントを作ることも出来る」

妹「OnMouseMoveの時はブループリント一覧には出てきてなかったよね? いったい何が違うんだろう……」

「確認した範囲だと、関数扱いになってるやつは全部ReturnValueピンがついてて、返り値が必要なものだった。でもイベントとして作った場合は返り値がない。というか作れない。返り値のないオーバーライド関数は自動でイベント扱いになるのか、返り値がないから意図的にイベントして作ったのかはわからないけど。OnKeyDownの場合はEventReplyの返り値が必要だったから関数になってたんだと思う」

妹「ひょっとしてActorとかにもオーバーライド関数あったりする?」

「あるけど、全部イベント扱いになってる。イベントHitとか、使ったことあるやつも多い。コンポーネントのイベントはコンポーネントが所有してる物だから、オーバーライド関数の欄にないけど」

妹「別に関数でもいいんだけど、右クリックで出すブループリントの一覧には出てくれた方がいいんだけど。色んなとこ探すの面倒だし」

「イベントグラフにノードが作れないわけだから、そこで表示すべきものではないっていう扱いなんだと思う。押すと関数を作ってそこを開くとか、別の仕組みにしないといけないから難しいだろうね」

妹「返り値があるかどうかと、イベントグラフに置けるかどうか以外の違いはないの?」

「他の違いは見つかってない。クラスを継承した場合、継承先でイベントを作ると継承先のイベントが実行されて、何もしなければ継承元のイベントが実行されるんだけど、これはオーバーライド関数の場合も全く同じだった。C++の場合だと、継承先からは必要なタイミングで継承元の関数も呼べるはずなんだけど、ブループリントではその仕組みが見つからなかった。これは探せばどこかにあるかもしれない」

妹「とりあえず今使ってる範囲では関係なさそうかな。それらしいのがブループリント一覧に出てこなかったら、オーバーライド関数の欄も見てみるという感じで」

※追記
継承元の関数を呼び出す方法
docs.unrealengine.com