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
のときに流れてきているのが分かります。