はじめに
C#の考え方として、Delegateよりはラムダ式が好まれるようになっているようです。(C#に取り組みだして日が浅いので違ってたらすいません)
ただ、ラムダ式でメソッドを呼び出して、コルーチンの結果を受けてコールバックさせると言う所で詰まってしまい、その解決法の1つの備忘録。
やり方は掲題の通り、UniRxとコルーチンを組み合わせる方法で解決します。
本題
以下は、コルーチンの終了タイミングをUniRxのObservableで待ち構えるやり方です。
以下のFromCoroutineを利用します。
Observable.FromCoroutine(Func<IEnumerator>, bool);
第1引数はコルーチンを宣言し、第2引数はyieldしたタイミングでOnNextを発行するかを設定します。
以下にFromCotoutineを用いたSampleを載せます。
void Hoge() { Fuga((System.Action result) => { Debug.Log("finish!"); }); } void Fuga(System.Action<bool> completion) { Observable.FromCoroutine(CoroutineSample, publishEveryYield: false).Subscribe( _ => Debug.Log("next"), () => completion(true) ).AddTo(gameObject); } IEnumerator CoroutineSample() { yield break; }
FugaでCotoutineSampleの結果をうけとり、その結果をHogeに返します。
注意点としては、Subscribeがコールされる度にコルーチンが発行されます。
この解決策としてはこちらの記事で紹介されているHot変換を行えば良いみたいなのです。
コルーチン自体をReactiveな扱いに出来て非常に便利なので是非用いていきたいですね。(まだまだUniRxの書き方になれていないので、経験が必要ですが…)