橋本翼(ツバサムス)

メタバースプログラマー。
UnityとUnreal Engineを専門的に扱う。
メタバース系スタートアップ企業に所属。

詳細はこちら

【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をコピーしました