概要
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面白いので他のテーマでも書いてみたいです!