概要
UniRxのAddToとは何かについてまとめてみました!
少しでもお役に立てればと思います!
UniRxの基本的な考え方
AddToについて説明する前にUniRxの基本的な考え方を軽く押さえたいと思います。
IObserverとIObservable
UniRxでは、イベントメッセージを発行する側(IObserver)とイベントメッセージを購読する側(IObservable)に分けられます。
今回取り上げるAddToはこのうちイベントメッセージを購読する側(IObservable)にて用いられるメソッドとなります。
イベントメッセージを購読する際に必要なメソッドがSubscribeです。
Subscribe
Subscribeとはイベントメッセージを購読する側(IObservable)にて使われるメソッドで、メッセージの受け取り時に実行するを関数を登録します。
this.UpdateAsObservable()
.Where(l => Input.GetMouseButtonDown(0))
.Subscribe(l => Hoge());
例えば上記だと、マウスがクリックされたときにHoge()を実行するようにSubscribeメソッドで登録しています。
本題
AddToとは
AddToとはSubscribeと対になって用いられ、AddToの引数に指定されたオブジェクトが破棄されたタイミングでSubscribeによるイベントメッセージの購読を終了するメソッドです。
また、Rxでは購読を生成することをSubscribeと呼ぶのに対して、購読を終了することをDisposeと呼びます。
そのため、Subscribeによって生成されたサブスクリプションに対してAddToを行うと「AddToの引数に指定されたオブジェクトの破棄タイミングでDisposeする」とも言えます。
AddToの使い方
Subscribeの後にAddTo()の引数に紐付けるGameObjectを指定します。すると、指定したGameObjectがDestroyされたタイミングで処理は停止します。
Observable.Timer(TimeSpan.FromSeconds (2))
.Subscribe (_ => Hoge())
.AddTo (this);
AddToが必要な理由
上記の処理にAddTo()がない場合、アプリが起動している間止まること無く実行されます。スクリプトがアタッチされたGameObjectが削除されても止まりません。購読者がいない間も購読が続く状況になり兼ねないのです。
処理的に無駄だったり、無いものにアクセスしようとするためNullアクセス例外が発生したりします。
Subscribeとセットで用いられるのはこのためです。
AddToの注意点
OnCompletedが発行されるわけではない点に注意が必要です。
OnCompletedは「ストリームが完了したためこれ以降メッセージを発行しない」ということを通知するメッセージです。
まとめ
AddToを忘れると無駄な処理に繋がるので、UniRxを用いる際は忘れずに!
UniRx面白いので他のテーマでも書いてみたいです!