UniRx

UniRx: TakeUntil

TakeUntil は引数で渡した IObservable が最初のデータを通知したら、自身の通知をそこで終了させるオペレータです。 以下のサンプルは、1 秒ごとにデータを通知しますが、スペースキーが押されると、そこで通知を終了します。 using System; using UniRx; u…

UniRx: Take と First と Single

Take, First, Single の各オペレータは、ストリームに流れる値を取り出します。 オペレータに応じて、それぞれストリームにいくつ値がながれるか、期待する個数が異なります。 Take は、ストリームの最初の N 個を取り出します(N は引数で指定)。不足があっ…

UniRx: Subject とそれ以外のソースでのストリームの流れを眺める

Subject にいくつかオペレータを敵賞して Subscribe する場合と Subject 以外のたとえば Range にいくつかオペレータを適用して Subscribe する場合 について、Observer にどのようにして値が流れるのか見ていきます。 まずは Subject から。 using System; …

UniRx: 時間を(複数)指定してイベント発行

下のコードは、1 秒、3 秒、4 秒後にイベントを発行するサンプルです。 using System; using System.Linq; using UniRx; using UniRx.Diagnostics; using UnityEngine; public class Main : MonoBehaviour { void Start() { var fireTimes = new[] { 1, 3, 4…

UniRx: Subject への購読とそのキャンセル処理を眺める

Subject クラスへの購読と、その購読のキャンセル処理について以下のサンプルコードで見ていきます。 using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { var subject = new Subject<int>(); // 購読する var disposable = sub</int>…

UniRx: Subject は IObserver であり IObservable でもある

Subject の定義をみると次のようになっています。 public sealed class Subject<T> : ISubject<T>, IDisposable, IOptimizedObservable<T> { } ISubject の定義は、 public interface ISubject<TSource, TResult> : IObserver<TSource>, IObservable<TResult> { } public interface ISubject<T> : ISubject<T, T>, I</t,></t></tresult></tsource></tsource,></t></t></t>…

UniRx: SubscribeWithState は Subscribe より効率がよい

以下のサンプルは、1 秒ごとにテキストを更新するサンプルです。 using System; using UniRx; using UnityEngine; using UnityEngine.UI; public class Main : MonoBehaviour { [SerializeField] private Text _text = null; void Start() { Observable.Inte…

UniRx: DistinctUntilChanged

Observable.DistinctUntilChanged は同じ値を連続して流さないオペレータです。 using UniRx; using UniRx.Diagnostics; using UnityEngine; public class Main : MonoBehaviour { void Start() { var s = new[] {1, 2, 3, 2, 2, 2, 5, 5} .ToObservable() .…

UniRx: Hot と Cold (2)

UniRx: Hot と Cold (1) - C#練習日記 の続きです。63 of 115 からです。 Cold な Observable は分岐できない Cold な Observable は Observer をひとつしか持てません。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour …

UniRx: Hot と Cold (1)

Rx の Hot, Cold について、以下のスライドが参考になります。 今日こそ理解するHot / Cold @社内RxSwift勉強会 from Yuki Takahashi www.slideshare.net このスライドではプログラミング言語として Swift を採用していますが、Rx は特定のプログラミング言…

UniRx: Distinct

Observable.Distinct は、ストリームに重複値を流さないようにするオペレータです。 using UniRx; using UniRx.Diagnostics; using UnityEngine; public class Main : MonoBehaviour { void Start() { var s = new[] {1, 2, 3, 2, 2, 5, 5} .ToObservable() …

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

Observable.FromCoroutineValue() でコルーチンを IObservable 化することができます。 コルーチンの yield return の値が OnNext に渡ります。 using System; using System.Collections; using UniRx; using UniRx.Diagnostics; using UnityEngine; public …

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

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

UniRx: Debug() 拡張メソッド

ObservableDebugExtensions.cs に Debug() 拡張メソッドが定義されています。 この拡張メソッドを使うと、OnNext や OnCompleted などのイベント時にログが出力されるようになります。 (これはデバッグ機能として提供されており、DEBUG シンボルが定義されて…

UniRx: Delay

Observable.Delay() は通知データを好きな期間だけ遅らせることができるオペレータです。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { Debug.Log("Start"); var s = Observable.Range(10, 3).Delay(…

UniRx: Empty

Observable.Empty() は、Subscribe() するとすぐに完了を通知します。 using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { var s = Observable.Empty<Unit>(); s.Subscribe(e => Debug.Log("e: " + e), () => Debug.Log("OnComp</unit>…

UniRx: Concat

Observable.Concat() は複数の IObservable<T> を順番に実行するオペレーターです。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { // 1 秒ごとに通知 var a = Observable.Interval(TimeSpan.FromSeconds</t>…

UniRx: 購読をキャンセルする

IObservable<T>.Subscribe() から返却される IDisposable の Dispose() を呼び出すと購読がキャンセルされます。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { private IDisposable _disposable; void Start() { var s </t>…

UniRx: AddTo() 拡張メソッドのソースを読む

この記事では、AddTo() 拡張メソッドを用いると、ゲームオブジェクトの破棄タイミングで購読を破棄する仕組みを眺めていきます。 次のサンプルコードでは、Observable.Interval() で一定時間ごとにログを出力します。 また、スペースキーを押すとシーンが切…

UniRx: Observable.ReturnUnit のソースを読む

Observable.ReturnUnit のサンプルコード using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { var s = Observable.ReturnUnit(); s.Subscribe(e => Debug.Log("e: " + e), () => Debug.Log("OnCompleted"))…

UniRx: Start

Observable.Start メソッドは、引数で指定した Func<T> 関数から生成したデータを通知します。 using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { private IObservable<DateTime> _observable; void Start() { _observable = Observabl</datetime></t>…

UniRx: Return

void Start() { var s = Observable.Return(100); s.Subscribe(e => Debug.Log(e), () => Debug.Log("OnCompleted")); } 実行結果です。 100 OnCompleted UniRx の Return の実装を読む。パフォーマンスを上げるために、通知する値の型に応じて実装をもって…