(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

OnDisableやOnDestroyをエディタを止めた時には実行しないようにする【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.5.0p1


はじめに

MonoBehaviourには無効になったときに呼ばれるOnDisableと、



破棄される時に呼ばれるOnDestroyという関数があります。



なお、GameObjectを削除すると両方呼ばれます。

イメージとしては以下のような感じ。

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

  private void OnDisable () {
    Debug.Log("OnDisable");
  }

  private void OnDestroy(){
    Debug.Log("OnDestroy");
  }

}

f:id:kan_kikuchi:20170201101539g:plain


ただし、これらの関数はエディタを止めた時にも実行されてしまいます。


f:id:kan_kikuchi:20170201101807g:plain


今回はエディタを止めた時にこれらを実行しない方法のご紹介です!


OnApplicationQuit

まず、エディタを止めた時だけ実行しないという設定はありません。

なので、 エディタを止めようとしているという事を検知し、その時だけ実行しないようにします。


その検知に使えるのがMonoBehaviourのOnApplicationQuitです。

アプリケーションが終了する前にすべてのゲームオブジェクトで呼び出されます


なお、Application.isPlayingはOnDisable、OnDestroy時にはまだtrueなので、今回は使えません。


実際に先ほどのコードにOnApplicationQuitを使って、OnDisableやOnDestroyが

エディタを止めた時には実行しないようにすると以下のような感じになります。

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

  private bool _isQuitting = false;

  private void OnApplicationQuit () {
    Debug.Log("OnApplicationQuit");
    _isQuitting = true && Application.isEditor;
  }

  private void OnDisable () {
    if(_isQuitting){
      return;
    }
    Debug.Log("OnDisable");
  }

  private void OnDestroy(){
    if(_isQuitting){
      return;
    }
    Debug.Log("OnDestroy");
  }

}

f:id:kan_kikuchi:20170201102024g:plain