Destroying the attached Behaviour will result in the game or scene receiving OnDestroy.
OnDestroy occurs when a scene or game ends. Any approach for this
will cause OnDestroy to be called. When running from inside the Editor
stopping the Play mode will end the application. As this end happens
an OnDestroy will be executed. Also, if a scene is closed and a
new scene is loaded the OnDestroy call will be made.
When built as a standalone application OnDestroy calls are made
when scenes end. A scene ending typically means a new scene is loaded.
Note: OnDestroy will only be called on game objects that have previously been active.
In the following scripts the behaviour of OnDestroy is shown. When running inside
ExampleClass1
a button is available. Using this button calls OnDestroy and then
switches to ExampleClass2
. Once ExampleClass2
is active OnDestroy will be used
when the application is closed. If ExampleClass1
quits by closing the application it
will call OnDestroy. (In the build and run of the application the console displays
the text output to the Player Log.)
#pragma strict public class ExampleClass1 extends MonoBehaviour { private var timePass: float = 0.0f; private var updateCount: int = 0; function Start() { Debug.Log("Start1"); } // code that generates a message every second function Update() { timePass += Time.deltaTime; if (timePass > 1.0f) { timePass = 0.0f; Debug.Log("Update1: " + updateCount); updateCount = updateCount + 1; } } function OnGUI() { if (GUI.Button(new Rect(10, 10, 250, 60), "Change to scene2")) { Debug.Log("Exit1"); SceneManager.LoadScene(1); } } // generate a message before the Start() function function OnEnable() { Debug.Log("OnEnable1"); } // or switched to ExampleClass2 function OnDestroy() { Debug.Log("OnDestroy1"); } }
using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement;
public class ExampleClass1 : MonoBehaviour { private float timePass = 0.0f; private int updateCount = 0;
void Start() { Debug.Log("Start1"); }
// code that generates a message every second void Update() { timePass += Time.deltaTime;
if (timePass > 1.0f) { timePass = 0.0f; Debug.Log("Update1: " + updateCount); updateCount = updateCount + 1; } }
void OnGUI() { if (GUI.Button(new Rect(10, 10, 250, 60), "Change to scene2")) { Debug.Log("Exit1"); SceneManager.LoadScene(1); } }
// generate a message before the Start() function void OnEnable() { Debug.Log("OnEnable1"); }
// generate a message when the game shuts down // or switched to ExampleClass2 void OnDestroy() { Debug.Log("OnDestroy1"); } }
ExampleClass2:
#pragma strict public class ExampleClass2 extends MonoBehaviour { function Start() { Debug.Log("Start2"); } function OnEnable() { Debug.Log("OnEnable2"); } // generate a message when the game shuts down function OnDestroy() { Debug.Log("OnDestroy2"); } }
using UnityEngine; using UnityEngine.UI;
public class ExampleClass2 : MonoBehaviour { void Start() { Debug.Log("Start2"); }
void OnEnable() { Debug.Log("OnEnable2"); }
// generate a message when the game shuts down void OnDestroy() { Debug.Log("OnDestroy2"); } }
OnDestroy cannot be a co-routine.