「Unity/UniRx/Subject」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→UniRxを使わない場合) |
(→Subjectの型を複数に) |
||
(同じ利用者による、間の30版が非表示) | |||
行1: | 行1: | ||
− | == | + | ==UniRxを使ったサンプル== |
<pre> | <pre> | ||
using UniRx; | using UniRx; | ||
行5: | 行5: | ||
// イベント登録 | // イベント登録 | ||
− | subject.Subscribe( | + | subject.Subscribe(message => Debug.Log("msg1:" + message)); |
// イベント発行 | // イベント発行 | ||
行17: | 行17: | ||
参考:https://qiita.com/toRisouP/items/2f1643e344c741dd94f8 | 参考:https://qiita.com/toRisouP/items/2f1643e344c741dd94f8 | ||
− | == | + | ===値を返さない場合=== |
− | + | ||
<pre> | <pre> | ||
+ | using UniRx; | ||
+ | Subject<Unit> subject = new Subject<Unit>(); | ||
+ | |||
+ | // イベント登録 | ||
+ | subject.Subscribe(_ => Debug.Log("ok")); | ||
+ | |||
+ | // イベント発行 | ||
+ | subject.OnNext(Unit.Default); | ||
+ | </pre> | ||
+ | |||
+ | 参考:https://light11.hatenadiary.com/entry/2018/11/01/232019 | ||
+ | |||
+ | ===外部からsubjectを使えるように=== | ||
+ | <pre> | ||
+ | using UniRx; | ||
using System; | using System; | ||
− | Action<string> OnMsg = delegate (string msg) { }; | + | class HogeRepository |
− | OnMsg += (msg) => { | + | { |
+ | 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); | ||
+ | </pre> | ||
+ | 参考:https://bibinbaleo.hatenablog.com/entry/2019/06/13/214652 | ||
+ | |||
+ | ==UniRxを使わない場合== | ||
+ | 上記の処理は、このように書く | ||
+ | <pre> | ||
+ | System.Action<string> OnMsg = delegate (string msg) { }; | ||
+ | OnMsg += (msg) => | ||
+ | { | ||
Debug.Log("msg1:" + msg); | Debug.Log("msg1:" + msg); | ||
}; | }; | ||
行29: | 行63: | ||
参考:https://sunagimo-app.hatenablog.com/entry/2019/03/14/032357 | 参考:https://sunagimo-app.hatenablog.com/entry/2019/03/14/032357 | ||
+ | |||
+ | ==値切り替え== | ||
+ | Selectを使う | ||
+ | <pre> | ||
+ | Subject<string> subject = new Subject<string>(); | ||
+ | subject | ||
+ | .Select( | ||
+ | data => "メッセージは" + data | ||
+ | ) | ||
+ | .Subscribe( | ||
+ | message => Debug.Log("msg1:" + message) | ||
+ | ); | ||
+ | subject.OnNext("hello"); | ||
+ | </pre> | ||
+ | ログ | ||
+ | msg1:メッセージはhello | ||
+ | |||
+ | ==購読停止== | ||
+ | disposable.Dispose()を使う。 | ||
+ | <pre> | ||
+ | Subject<string> subject = new Subject<string>(); | ||
+ | // イベント登録 | ||
+ | var disposable = subject | ||
+ | .Subscribe( | ||
+ | message => Debug.Log("msg1:" + message) | ||
+ | ); | ||
+ | // イベント発行 | ||
+ | subject.OnNext("hello"); | ||
+ | // 購読停止 | ||
+ | disposable.Dispose(); | ||
+ | </pre> | ||
+ | |||
+ | ==条件== | ||
+ | Whereを使う | ||
+ | <pre> | ||
+ | Subject<string> subject = new Subject<string>(); | ||
+ | subject | ||
+ | .Where( | ||
+ | data => data == "world" | ||
+ | ) | ||
+ | .Subscribe( | ||
+ | message => Debug.Log("msg1:" + message) | ||
+ | ); | ||
+ | subject.OnNext("hello"); | ||
+ | subject.OnNext("world"); | ||
+ | </pre> | ||
+ | worldだけでる。 | ||
+ | |||
+ | ==重複削除== | ||
+ | Distinctを使う。 | ||
+ | <pre> | ||
+ | Subject<string> subject = new Subject<string>(); | ||
+ | subject | ||
+ | .Distinct() | ||
+ | .Subscribe( | ||
+ | message => Debug.Log("msg1:" + message) | ||
+ | ); | ||
+ | subject.OnNext("hello"); | ||
+ | subject.OnNext("world"); | ||
+ | subject.OnNext("world"); | ||
+ | </pre> | ||
+ | ログ | ||
+ | <pre> | ||
+ | msg1:hello | ||
+ | msg1:world | ||
+ | </pre> | ||
+ | |||
+ | 参考;https://noriok.hatenadiary.jp/entry/2018/09/16/185716 | ||
+ | |||
+ | ==errorやCompleted処理== | ||
+ | <pre> | ||
+ | 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(); | ||
+ | </pre> | ||
+ | ログ | ||
+ | <pre> | ||
+ | msg1:world | ||
+ | Completed | ||
+ | </pre> | ||
+ | |||
+ | 参考:https://www.fast-system.jp/unirx-%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E3%81%A8%E4%BA%BA%E6%A8%A9%E3%81%8C%E7%84%A1%E3%81%84%E6%B0%97%E3%81%8C%E3%81%97%E3%81%A6%E3%81%8D%E3%81%9F%E3%81%AE%E3%81%A7%E5%8B%89%E5%BC%B7%E3%81%97/ | ||
+ | |||
+ | 参考:https://light11.hatenadiary.com/entry/2018/11/20/225152 | ||
+ | |||
+ | ==Subjectの型を複数に== | ||
+ | <pre> | ||
+ | public struct DrawInfo | ||
+ | { | ||
+ | public float X; | ||
+ | public float Y; | ||
+ | } | ||
+ | IObservable<DrawInfo> observeDrawInfo = new Subject<DrawInfo>(); | ||
+ | // イベント登録 | ||
+ | observeDrawInfo.Subscribe(drawInfo => Debug.Log("ok")).AddTo(this); | ||
+ | // イベント発行 | ||
+ | observeDrawInfo.OnNext(new DrawInfo | ||
+ | { | ||
+ | X = x, | ||
+ | Y = y | ||
+ | }); | ||
+ | </pre> | ||
+ | |||
+ | ==その他処理== | ||
+ | オペレーター一覧 | ||
+ | |||
+ | 参考:https://qiita.com/toRisouP/items/3cf1c9be3c37e7609a2f |
2023年6月18日 (日) 16:51時点における最新版
目次
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 float X; public float Y; } IObservable<DrawInfo> observeDrawInfo = new Subject<DrawInfo>(); // イベント登録 observeDrawInfo.Subscribe(drawInfo => Debug.Log("ok")).AddTo(this); // イベント発行 observeDrawInfo.OnNext(new DrawInfo { X = x, Y = y });
その他処理
オペレーター一覧