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オブジェクトを登録する」 という意味。
流れ
- objSample(Subjectオブジェクト)
- ~AsObservableメソッド(Observerオブジェクト)
- Whereメソッド(オペレーター)
- Subscribeメソッド(Observerに処理を繋いで、メソッド内の処理を実行する)
※オペレーターはなくてもいい
コメント