UniRx: ToObservable() が From() に代わりになるのかな

Rx には From というオペレータがあります。 UniRx には From が定義されてないようですが、ToObservable() というのがあります。 このメソッドを使うと、IEnumerable<T>IObservable<T> に変換できます。

using UniRx;
using UniRx.Diagnostics;
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        var s = new[] {10, 20, 30}.ToObservable();
        s.Debug().Subscribe();      
    }
}

実行結果です。

[20:20:37:877] OnSubscribe
[20:20:37:882] OnNext(10)
[20:20:37:884] OnNext(20)
[20:20:37:885] OnNext(30)
[20:20:37:886] OnCompleted()

ToObservable() は、コルーチンを Observable 化することもできます。

publishEveryYield が false の場合

void Start()
{
  var s = G().ToObservable(publishEveryYield: false);
  s.Debug().Subscribe();
}

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

実行結果です。

[20:30:57:423] OnSubscribe
[20:30:57:822] OnNext(())
[20:30:57:824] OnCompleted()

publishEveryYield が true の場合

void Start()
{
  var s = G().ToObservable(publishEveryYield: true);
  s.Debug().Subscribe();
}

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

実行結果です。

[20:31:55:981] OnSubscribe
[20:31:55:995] OnNext(())
[20:31:56:024] OnNext(())
[20:31:56:375] OnNext(())
[20:31:56:396] OnNext(())
[20:31:56:397] OnCompleted()

publishEveryYield が true の場合は、yield return が実行されるたびに OnNext されるようになります。

ログに出力されている 4 つの OnNext のうち、最初の 3 つの OnNext は yield return の実行分で、 最後のは、コルーチンが正常終了したときに通知される OnNext です。

コルーチンが yield return しなくても OnNext は呼ばれる

void Start()
{
  var s = H().ToObservable(publishEveryYield: false);
  s.Debug().Subscribe();
}

IEnumerator H()
{       
  yield break;
}

実行結果です。

[20:43:58:160] OnSubscribe
[20:43:58:172] OnNext(())
[20:43:58:174] OnCompleted()

コルーチンを Observable 化するとき、コルーチンが yield return せず、単に yield break するだけでも OnNext は呼ばれます。

参考