Version: 2023.1
LanguageEnglish
  • C#

MonoBehaviour.OnDestroy()

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Switch to Manual

Description

Destroying the attached Behaviour will result in the game or Scene receiving OnDestroy.

OnDestroy occurs when a Scene or game ends. Stopping the Play mode when running from inside the Editor 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.)

Warning: If the user suspends your application on a mobile platform, the operating system can quit the application to free up resources. In this case, depending on the operating system, Unity might be unable to call this method. On mobile platforms, it is best practice to not rely on this method to save the state of your application. Instead, consider every loss of application focus as the exit of the application and use MonoBehaviour.OnApplicationFocus to save any data.

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 switches to another Scene // or switched to ExampleClass2 void OnDestroy() { Debug.Log("OnDestroy1"); } }

ExampleClass2:

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.