1. ホーム 
  2. 備忘録 
  3. Unity

OnDestroy関数

破棄処理

MonoBehaviour を継承したクラスをもつゲームオブジェクトが破棄されるタイミングでは OnDestory 関数が呼ばれる

この関数を使って破棄処理(解放処理)を行ったり、消される直前に一度だけ行いたい処理を記述することができる


Unity は C# で記述するためメモリ解放は GC がやってくれるように思われがちだが、

Destroy で破棄したゲームオブジェクトの参照を保持したままだと GC の収集対象とならない

また、参考文献2のとおりテクスチャなどの一部の処理は C++ 側のコードも動いており、メモリリークの原因となってしまう

クラス内で他のクラスの参照を持つ場合は破棄処理にてきちんと null を代入しておく方が良い


メモリリークが発生していないか確認する方法に MemoryProfiler がある。


public class Sample : MonoBehaviour
{
  Texture2D tex;

  /// <summary>
  /// 起動処理
  /// </summary>
  void Start()
  {
    tex = new Texture2D(256, 256);
    Destroy(tex);
  }

  /// <summary>
  /// 破棄処理
  /// </summary>
  void OnDestroy()
  {
    // tex に null を代入することできちんと参照が切れて、
    // ガベージコレクションの対象となるため、メモリリークが発生しなくなる
    tex = null;
  }
}

    参考文献

  1. Unityにおけるnullチェック(4) - メモリリークを防ぐ
  2. 【Unity】Unityでメモリリーク発生?原因と調査方法について