【Unity】エディタ拡張でUniRxを用いてコルーチンを実行する

Unityさんのエディタ拡張をしているとコルーチンを利用したいみたいなシーンがたまに出てくるのですけど、エディタスクリプトではコルーチンが利用できません。
EditorApplication.updateを利用すればそれっぽいことが出来ますが、ハンドリングも大変だなーと調べてみると、以下のようなEditorApplication.updateをラップしたものを公開されているのがいくらか見つかります。
UnityEditor上でStartContinueっぽいのを動かす - Qiita
EditorCoroutine: coroutines for Unity editor operations. Usage: EditorCoroutine.start(myIEnumerator) · GitHub

他にうまいことやることないのかなーと思いながらいつも通り実装していると、UniRxでObservable.FromCoroutineというクラスがあることに気づきました。
こちらも結局内部的には上記のメソッドを利用しているようですが、普段からUniRxを使っているのであれば使わない手はない。

ということで以下サンプルです。
gist.github.com

めっちゃ雑ですけど、メニューからWindowを開くと経過時間を加算していって、閾値に達したら「completed!」って表示するだけのコードです。
UniRxを使わなかったらOnEnableでEditorApplication.updateに足して、OnDestroyでEditorApplication.updateから消すみたいなコードを書かざるをえないのと、このくらいシンプルならまだいいですけど、複数のコルーチンを待ち合わせしたりみたいなことになってくるとつらみで死んでしまうので、以下のようなコードだけで済むのは大変ありがたいですね。

Observable.FromCoroutine (Update).Subscribe (_ => isCompleted = true);

このサンプルはコルーチンに特に引数を渡してませんが、引数付きのコルーチンも特に問題なく動きます。

また、「OpenFromCUI」というメソッドはバッチモードの実行を想定したメソッドになります。
Macであれば、ターミナルで以下のように実行することで動作確認できます。

/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -projectPath ${Unityプロジェクトのパス} -executeMethod CoroutineWindow.OpenFromCUI -logFile build.log;cat build.log

通常なら「-quit」オプションをつけて起動するところですが、コルーチンを使っているときに「-quit」を使ってしまうとキックするだけで完了を待たずに死んでしまうのでつけてません。
また、「-quit」オプションをつけていないので、明示的に「EditorApplication.Exit (0)」を実行することで終了しています。

スポンサーリンク