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 に処理を繋いでメソッド内の処理を実行する)
※オペレーターは無くても良い