「Unity/UniRx/Subject」の版間の差分
ナビゲーションに移動
検索に移動
| (同じ利用者による、間の33版が非表示) | |||
| 1行目: | 1行目: | ||
== | ==UniRxを使ったサンプル== | ||
<pre> | <pre> | ||
using UniRx; | using UniRx; | ||
| 5行目: | 5行目: | ||
// イベント登録 | // イベント登録 | ||
subject.Subscribe( | subject.Subscribe(message => Debug.Log("msg1:" + message)); | ||
// イベント発行 | // イベント発行 | ||
| 16行目: | 16行目: | ||
参考:https://qiita.com/toRisouP/items/2f1643e344c741dd94f8 | 参考:https://qiita.com/toRisouP/items/2f1643e344c741dd94f8 | ||
===値を返さない場合=== | |||
<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; | |||
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); | |||
</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); | |||
}; | |||
OnMsg("hello"); | |||
</pre> | |||
参考: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日 (日) 07: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
});
その他処理
オペレーター一覧