25
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【UniRx】AddTo とは何かまとめてみた

Last updated at Posted at 2019-05-07

概要

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

参考

25
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?