【Unity】UniRx のオペレーターと各メソッドの使用方法

Unity

UniRx のオペレーターと各メソッドの使用方法

スクリプト

using UniRx;
using UniRx.Triggers;
using UnityEngine;

public class Sample : MonoBehaviour
{
    [SerializeField]
    private GameObject objSample;

    [SerializeField]
    private Button btnSample;

    private void Start()
    {
        //Sample オブジェクトの「OnCollisionEnter()」を「Observable」に変換して購読する(監視開始)
        objSample.OnCollisionEnterAsObservable()
            //他のコライダーに接触したら Obsevable からメッセージが発行され、それを受け取って collision 変数を渡し、接触相手の名前を表示する
            .Subscribe(collision => Debug.Log(collision.gameObject.name))
            //Sample クラスが消えたら講読をやめる
            .AddTo(this);

        //Sample クラスの「OnDestroy()」を「Observable」に変換して購読する(監視開始)
        this.OnDestroyAsObservable()
            //Sample クラスが消えたら Obsevable からメッセージが発行され、それを受け取って「破棄された」と表示する
            .Subscribe(_ => Debug.Log("破棄された"));
        //Sample ボタンの UnityEvent である onClick を Observable に変換して購読する(監視開始)
        btnSample.OnClickAsObservable()
            //Sample ボタンが押されたら Observable からメッセージが発行されるが、2.0秒間、2回目以降のメッセージを無視する
            .ThrottleFirst(System.TimeSpan.FromSeconds(2.0f))
            //Observable から発行されたメッセージを受け取って「押された」と表示する
            .Subscribe(_ => Debug.Log("押された"))
            //Sample クラスが消えたら講読をやめる
            .AddTo(this);

        //Sample クラスの「Update()」を「Observable」に変換して購読する(監視開始)
        this.UpdateAsObservable()
            //Observable からメッセージが毎フレーム発行されるが、スペースキーが押されていない間はそれらのメッセージを無視する
            .Where(_ => Input.GetKey(KeyCode.Space))
            //2.0秒間、2回目以降のメッセージを無視する
            .ThrottleFirst(System.TimeSpan.FromSeconds(2.0f))
            //Observable から発行されたメッセージを受け取って「ジャンプ」と表示する
            .Subscribe(_ => Debug.Log("ジャンプ"))
            //Sample クラスが消えたら講読をやめる
            .AddTo(this);
    }
}

各メソッド

オペレーター

Where()メッセージ(通知)を受け取る条件を設定する。
(「Subscribe()」の中の処理が1つだけの時に使用するのが良い)
ThrottleFirst()1度メッセージ(通知)を受け取った後に
再びメッセージ(通知)を受け取るまでの待機時間
2回目以降のメッセージ(通知)を無視する時間
を設定できる。
(主にボタンやキーの入力等で使用)

その他

~AsObservable()元のメソッド(「As」の前の名前のメソッド
同じ動きをする Observable。
「Start()」内に記述する事で
「Start()」を見るだけで全体の処理が分かるようになる
というメリットがある。
Subscribe()購読(監視)相手を登録してメッセージ(通知)を伝達する。
(Obsevable の「Subscribe()」を実行して「Observer」を登録する)
イベントを購読(監視)してメッセージ(通知)を発行する。

処理の流れ

説明

上記の例では、Sample オブジェクトSample ボタン対象先で「~AsObservable()」が「Obsevable」であり、「1つのメッセージの塊」である。

これが「Subscribe()」に登録できる Observer オブジェクトである。

このようにする事で購読(監視)を開始させるが、これだけではメッセージ(通知)を発行しても受け取り先が無いため、「Subscribe()」を使用する事で発行したメッセージ(通知)を受け取って、処理が連動して動くようになっている。

これらの処理の間に入るのが「Where()」や「ThrottleFirst()」等のオペレーターであり、メッセージの情報をフィルタリングしている。

Observableを購読する」とは「ObservableのSubscribe()」を実行して、Observer オブジェクトを登録するという意味である。

流れ

  1. objSample(Subject オブジェクト
  2. ~AsObservable()(Observer オブジェクト
  3. Where()(オペレーター
  4. Subscribe()(Observer に処理を繋いでメソッド内の処理を実行する

※オペレーターは無くても良い

お問い合わせ

    タイトルとURLをコピーしました