【Unity】【UniRx】コルーチンをObservableに変換する

コルーチンをObservableに変換する方法のまとめです。

Observable.FromCoroutine

Observable.FromCoroutineを使うとコルーチンが終了したときに
OnNext()とOnCompleted()が呼ばれるObservableを作れます。

using System.Collections;
using UnityEngine;
using UniRx;

public class Example : MonoBehaviour 
{
    public void Start()
    {
        Observable.FromCoroutine(ExampleCoroutine)
            .Subscribe(_ => Debug.Log("OnNext"), () => Debug.Log("OnCompleted"))
            .AddTo(this);
    }

    private IEnumerator ExampleCoroutine()
    {
        yield return new WaitForSeconds(1.0f);
    }

}

OnNextを好きなタイミングで発行したい場合は下記のようにします。

using System.Collections;
using UnityEngine;
using UniRx;

public class Example : MonoBehaviour 
{
    public void Start()
    {
        Observable.FromCoroutine<int>(ExampleCoroutine)
            .Subscribe(i => Debug.Log("OnNext : " + i), () => Debug.Log("OnCompleted"))
            .AddTo(this);
    }

    private IEnumerator ExampleCoroutine(IObserver<int> observer)
    {
        for (int i = 0; i < 3; i++) {
            yield return new WaitForSeconds(1.0f);
            observer.OnNext(i);
        }
        observer.OnCompleted();
    }

}

Observable.FromCoroutineValue

Observable.FromCoroutineValueを使うとコルーチン内で
yield return xとして返した値をOnNext()として発行できます。

コルーチンの最後に到達した時点でOnCompleted()も発行されます。

using System.Collections;
using UnityEngine;
using UniRx;

public class Example : MonoBehaviour 
{
    public void Start()
    {
        Observable.FromCoroutineValue<int>(ExampleCoroutine)
            .Subscribe(i => Debug.Log("OnNext : " + i), () => Debug.Log("OnCompleted"))
            .AddTo(this);
    }

    private IEnumerator ExampleCoroutine()
    {
        for (int i = 0; i < 3; i++) {
            yield return i;
        }
    }

}