Torus Solutions 改

Ello 2019-02-03T17:54:45.000Z

UE4 の Blueprint で高階関数は実現できるか。

Blueprint の関数は関数の引数として渡すことはできないので、ファーストクラスのデータ型ではない。なので、Blueprint で関数では高階関数は作れない。そこで、高階関数をエミュレートするような方法を考えてみる。

まず簡単に思いつくのは Blueprint の関数を Blueprint クラスでラップするという方法で、これがわかりやすい。ただ、関数の一つ一つについて、いちいち新しくクラスを作る必要があるので、現実的にはちょっとだるい。

なので、しばらく考えた結果、イベントを使うとできそうな気がしてきた。イベントは 1 個のイベントグラフの中で幾つでも定義できるので、比較的作りやすい。イベントは関数の引数にすることはできるけど、戻り値にすることはできない。しかし、イベントディスパッチャにバインドすることはできる。また、イベント単体では状態を保つことができないので、何れにしてもそれをラップするクラスは必要になる。

ここでは、Blueprint クラスを 1 個だけ作って、その中で関数に継続手続きを渡せるようにイベントディスパッチャをメンバ変数として定義した。イベントを関数のように呼び出すときは、まず Blueprint クラスの中で自分の分身を作り、その中のイベントディスパッチャに、継続手続きとしてカスタムイベントをバインドする。イベントを呼び出すときには必ず分身を作るので、イベントディスパッチャはインスタンスごとに 1 個だけあれば良い。

というわけで、わかりにくいけど、上のような Blueprint ができた。イベントだと Delay なども使えるので汎用性が高いし、一連の処理を 1 画面の中にかけるので便利。でも、いちいちイベントディスパッチャにバインドするのとかはちょっとめんどくさい。あと、使い終わった分身インスタンスも片付けないとメモリがリークしてしまう。