【UniRX】UpdateAsObservableとAddToを併用した場合で破棄されたらOnCompletedは呼ばれるのか?

Unity (2021.3.2f1)

はじめに

UpdateAsObservableは破棄されるとOnCompletedを発行します。

AddToは破棄されるとOnCompletedを発行せずストリームを終了します。

これを併用した場合にどっちが優先されるのかを検証してみました。

結論

OnCompletedが呼ばれた。

なので以下のコードはゲームオブジェクト破棄時にOnCompletedが呼ばれる。

this.UpdateAsObservable() // これ
      .Subscribe(_ =>
      {
           Debug.Log("OnNext");
      },
      // OnCompleted
      () =>
      {
          Debug.Log("OnCompleted");
      }).AddTo(this); // これ

ゲームオブジェクト破棄時というのは下記も含まれます。

  • 別シーン移動時
  • アプリ終了時(エディタプレイの終了時も同義)

なのでOnCompleteで処理を書いていると、

アプリ終了時にGameObjectに参照して思わぬNullReferenceException(ぬるぽ)が発生するなんてことが結構あったりします。

あとがき

どちらも解放忘れを防止するありがたい機能なんですが、

組み合わせによっては想定と違う動きをする可能性があるので注意が必要ですね。