UniRx ============================= ###### tags: `Unity`, `C#` ```csharp= using UniRx; ``` OnNextとSubscribe ----------------------------- - Subscribe : メッセージの受け取り時に実行するを関数を登録する - OnNext : Subscribeで登録された関数にメッセージを渡して実行する ```csharp= Subject<string> subject = new Subject<string>(); // subject.Subscribe(msg => Debug.Log(msg)); subject.Subscribe(msg => Debug.Log(msg)); subject.Subscribe(msg => Debug.Log(msg)); subject.OnNext("Hello"); subject.OnNext("World"); ``` #### Subject - Subscribeメソッド : 実行してほしい関数を登録する - OnNextメソッド : 登録した関数に引数を渡して順に処理する IObserverとIObservable ----------------------------- Subjectの中身は実は、 - **IObserverインターフェース** - **IObservableインターフェース** の2つを実装している。 ```csharp= using System; namespace UniRx { public interface IObserver<T> { // メッセージの発行が完了したことを通知する void OnCompleted(); // 発生したエラーを通知するメッセージを発行する void OnError(Exception error); // イベントを発行する void OnNext(T value); } public interface IObservable<T> { IDisposable Subscribe(IObserver<T> observer); } } ``` **IObserverは値を発行(OnNext)する** **IObservableは値を購読(Subscribe)する** Subjectクラス ----------------------------- ### 定義 ```csharp= public sealed class Subject<T> : ISubject<T>, IDisposable, IOptimizedObservable<T>{} ``` オペレータ ----------------------------- IObserver -> Subject -> IObservable という構造から IObserver -> Subject -> Operator -> IObservable という構造で実行させてみる。 ### Where Whereはフィルタリングを行うオペレータ ```csharp= Subject<string> subject = new Subject<string>(); // 発行時の文字列がEnemyのときにのみ実行される subject .Where(x => x == "Enemy") .Subscribe(x => Debug.Log(msg)); // イベントの発行 subject.OnNext("Wall"); subject.OnNext("Enemy"); // これだけ表示される ``` ### Select Selectはメッセージを変換するオペレータ ### Distinct Distinctは重複を排除するオペレータ ### Buffer Bufferは一定個数まとまつまで待つオペレータ ### ThrottleFirst 短時間にまとめてきた場合に先頭のみを使うオペレータ ##### 他にもいろいろ ストリーム ----------------------------- ストリームとは、メッセージが発行されてからSubscribeに到達するまでの一連の処理の流れのことをいう。 **Stream** msg -> Subject -> Filter -> Subscribe OnNext OnError OnCompleted ----------------------------- ### OnNext イベントの通知を担う ```csharp= // subjectの定義 Subject subject = new Subject<int>(); // 購読 subject.Subscribe(x => Debug.Log(x)); // 発行 subject.OnNext(100); ```