facebook twitter hatena line email

「Unity/UniRx/Subject」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(Subjectの型を複数に)
 
(同じ利用者による、間の32版が非表示)
行1: 行1:
==サンプル==
+
==UniRxを使ったサンプル==
 
<pre>
 
<pre>
 
using UniRx;
 
using UniRx;
行5: 行5:
  
 
// イベント登録
 
// イベント登録
subject.Subscribe(msg => Debug.Log("msg1:" + msg));
+
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を使わない場合==
 
==UniRxを使わない場合==
このように書く
+
上記の処理は、このように書く
 
<pre>
 
<pre>
Action<string> OnMsg = delegate (string msg) { };
+
System.Action<string> OnMsg = delegate (string msg) { };
OnMsg += (msg) => {
+
OnMsg += (msg) =>
 +
{
 
     Debug.Log("msg1:" + msg);
 
     Debug.Log("msg1:" + msg);
 
};
 
};
 
OnMsg("hello");
 
OnMsg("hello");
 
</pre>
 
</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日 (日) 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://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の型を複数に

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
});

その他処理

オペレーター一覧

参考:https://qiita.com/toRisouP/items/3cf1c9be3c37e7609a2f