UniRxとコルーチンを組み合わせる

はじめに

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の書き方になれていないので、経験が必要ですが…)