もぶろぐ

もぶのログ、それがもぶろぐ。

【UniRx】AddToについて【使い方】

はじめに

AddTo() は、UniRxが提供している拡張メソッドです。
UniRxでは、購読の破棄を正しく行わないとメモリリークが発生します。
AddTo()を記述する事で、引数に渡したGameObjectがDestroyされる際に自動で購読破棄されるようになります。

使い方

AddTo()は、Subscribe時にメソッドチェーンで続けて記述します。
(厳密には、IDisposableインスタンス全てに生やすことが可能です)

自身の寿命に紐づける時

using UniRx;

class Sample : MonoBehaviour
{
    IntReactiveProperty score = new IntReactiveProperty();

    void Awake()
    {
        score.Subscribe(x => 購読処理)
            .AddTo(this); // AddTo(gameObject)と同義
    }
}

もちろん、他者の寿命に紐づける事も可能です。

[SerializeField] GameObject other;

void Awake
{
    score.Subscribe(x => 購読処理)
        .AddTo(other);
}

挙動

GameObjectを渡した場合は、GameObjectがDestroyされると自動的に購読破棄されます
Componentを渡した場合は、アタッチされているGameObjectがDestroyされると自動的に購読破棄されます

いずれも、GameObjectがDestroyされる時にのみ破棄される事に注意が必要です

まとめ

  • 購読破棄忘れによるメモリリークを防ぐ
  • Subscribe時にメソッドチェーンで記述する
  • GameObjectを渡した場合は、GameObjectがDestroyされると自動的に購読破棄される
  • Componentを渡した場合は、アタッチされているGameObjectがDestroyされると自動的に購読破棄される