コルーチンを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; } } }