Unity/UniRx/Subject
提供: 初心者エンジニアの簡易メモ
目次
[非表示]UniRxを使ったサンプル
using UniRx; Subject<string> subject = new Subject<string>(); // イベント登録 subject.Subscribe(message => Debug.Log("msg1:" + message)); // イベント発行 subject.OnNext("hello");
ログ
msg1:hello
参考:https://qiita.com/toRisouP/items/2f1643e344c741dd94f8
値を返さない場合
using UniRx; Subject<Unit> subject = new Subject<Unit>(); // イベント登録 subject.Subscribe(_ => Debug.Log("ok")); // イベント発行 subject.OnNext(Unit.Default);
参考:https://light11.hatenadiary.com/entry/2018/11/01/232019
外部からsubjectを使えるように
using UniRx; using System; class HogeRepository { private Subject<Unit> observeSubject = new Subject<Unit>(); public IObservable<Unit> ObserveSubject { get => observeSubject; } public void ReceiveHogeMessage() { // イベント発行 subject.OnNext(Unit.Default); } } var hogeRepository = new HogeRepository(); // イベント登録 hogeRepository.ObserveSubject.Subscribe(_ => Debug.Log("ok")).AddTo(this);
参考:https://bibinbaleo.hatenablog.com/entry/2019/06/13/214652
UniRxを使わない場合
上記の処理は、このように書く
System.Action<string> OnMsg = delegate (string msg) { }; OnMsg += (msg) => { Debug.Log("msg1:" + msg); }; OnMsg("hello");
参考:https://sunagimo-app.hatenablog.com/entry/2019/03/14/032357
値切り替え
Selectを使う
Subject<string> subject = new Subject<string>(); subject .Select( data => "メッセージは" + data ) .Subscribe( message => Debug.Log("msg1:" + message) ); subject.OnNext("hello");
ログ
msg1:メッセージはhello
購読停止
disposable.Dispose()を使う。
Subject<string> subject = new Subject<string>(); // イベント登録 var disposable = subject .Subscribe( message => Debug.Log("msg1:" + message) ); // イベント発行 subject.OnNext("hello"); // 購読停止 disposable.Dispose();
条件
Whereを使う
Subject<string> subject = new Subject<string>(); subject .Where( data => data == "world" ) .Subscribe( message => Debug.Log("msg1:" + message) ); subject.OnNext("hello"); subject.OnNext("world");
worldだけでる。
重複削除
Distinctを使う。
Subject<string> subject = new Subject<string>(); subject .Distinct() .Subscribe( message => Debug.Log("msg1:" + message) ); subject.OnNext("hello"); subject.OnNext("world"); subject.OnNext("world");
ログ
msg1:hello msg1:world
参考;https://noriok.hatenadiary.jp/entry/2018/09/16/185716
errorやCompleted処理
Subject<string> subject = new Subject<string>(); subject .Subscribe( message => Debug.Log("msg1:" + message), error => Debug.LogError("Error" + error), () => Debug.Log("Completed") ); subject.OnNext("world"); subject.OnCompleted();
ログ
msg1:world Completed
参考:https://light11.hatenadiary.com/entry/2018/11/20/225152
Subjectの型を複数に
public struct DrawInfo { public int PlayerId; public string Kind; public int Color; public float X; public float Y; } IObservable<DrawInfo> observeDrawInfo = new Subject<DrawInfo>(); // イベント登録 observeDrawInfo.Subscribe(_ => Debug.Log("ok")).AddTo(this);
その他処理
オペレーター一覧