UniRx: コルーチンを IObservable 化する

Observable.FromCoroutineValue() でコルーチンを IObservable 化することができます。 コルーチンの yield return の値が OnNext に渡ります。

using System;
using System.Collections;
using UniRx;
using UniRx.Diagnostics;
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        var s = Observable.FromCoroutineValue<int>(G);
        s.Debug().Subscribe();
    }
    
    IEnumerator G()
    {        
        yield return 10;
        yield return 20;
        yield return 30;
    }
}

実行結果です。

OnSubscribe
OnNext(10)
OnNext(20)
OnNext(30)
OnCompleted()

ちなみに、コルーチン内で yield return した値は全て同一フレーム内で流れてきます。

Time.frameCount でフレーム値を表示するようにしてみます。

using System;
using System.Collections;
using UniRx;
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        var s = Observable.FromCoroutineValue<int>(G);
        s.Subscribe(
            e => Debug.Log($"e: {e} frame: {Time.frameCount}"),
            () => Debug.Log("OnCompleted"));
    }
    
    IEnumerator G()
    {        
        yield return 10;
        yield return 20;
        yield return 30;
    }
}

実行結果です。

e: 10 frame: 1
e: 20 frame: 1
e: 30 frame: 1
OnCompleted

コルーチン G() の 3 つの値が全て Time.frameCount = 1 のときに流れてきているのが分かります。