sunagimoブログ

主にUnityに関する技術を取り上げます

【Unity】UniRxを覚える(3)

前回の記事。

sunagimo-app.hatenablog.com




コルーチン

UnityのコルーチンをIObservableに変換

Observable.FromCoroutine


コルーチンの終了タイミングをストリームで扱うことが可能

    void Start()
    {
        Observable.FromCoroutine(TestCoroutine)
            .Subscribe(
                e => {
                    Debug.Log("next");
                },
                () => {
                    Debug.Log("complete");
                }    
            ).AddTo(gameObject);
    }

    IEnumerator TestCoroutine()
    {
        Debug.Log("start");
        yield return new WaitForSeconds(4);
        Debug.Log("finish");
    }



start->finish->next->Complete


コルーチンから結果を返す

Observable.FromCoroutineValue

    void Start()
    {
        Observable.FromCoroutineValue<int>(ReturnValueCoroutine)
                    .Subscribe(e => Debug.Log(e));
    }

    IEnumerator ReturnValueCoroutine()
    {
        for(var idx = 0; idx < 10; ++idx)
        {
            yield return idx;
        }
    }


0から9まで出力


コルーチン内でOnNextを発行

    void Start()
    {
        Observable.FromCoroutine<int>(observer => CallOnNextCoroutine(observer))
                .Subscribe(
                    e => {
                        Debug.Log(e);
                    }
                ).AddTo(gameObject);
    }

    IEnumerator CallOnNextCoroutine(IObserver<int> observer)
    {
        observer.OnNext(1);
        yield break;
    }



まとめ

3記事に分けて学習していきました。
おそらく入門程度の知識を身についたと思います。

ほぼすべての処理を初期化で行うのでどのくらいの負荷がかかるのかとか、
チームで導入するには学習コストが高いなどの気になるところはあります。

ただその分、今まで何十行もかけて書いてた処理を数行でかけるようになったりと、
可読性もあがります。


私個人としてはとても便利だと思うので、
ここから更に理解を深めて積極的に使っていきたいです。



参考にさせていただいたサイト様

qiita.com