Version: 2017.3

Object.DontDestroyOnLoad

Switch to Manual
public static void DontDestroyOnLoad (Object target);

Parameters

target The object which is not destroyed on scene change.

Description

Makes the object target not be destroyed automatically when loading a new scene.

When loading a new level all objects in the scene are destroyed, then the objects in the new level are loaded. In order to preserve an object during level loading call DontDestroyOnLoad on it. If the object is a component or game object then its entire transform hierarchy will not be destroyed either.

Note: DontDestroyOnLoad does not return a value. It is also intended to have it's argument changed. The typeof operator makes this change if it is needed.

Calling DontDestroyOnLoad can make the object exist on all scenes. In the example below there are two scenes - ExampleScript1 and ExampleScript2.. One has a Cube and the other a Sphere. A DontDestroyOnLoad function on the first scene is connected to a Cylinder. This is loaded in Awake. When the ExampleScript1 button is pressed ExampleScript1 is closed and ExampleScript2 is loaded. The Cylinder from ExampleScript1 is copied to ExampleScript2. When ExampleScript2 is closed by pressing the Button ExampleScript1 is reloaded. This scene always has the Cylinder. The management of the Cylinder is the DontDestroyOnLoad function.

ExampleScript1:

// Connected to the Cube and includes a DontDestroyOnLoad()
// LoadScene() is called by the first  script and switches to the second.

using UnityEngine; using UnityEngine.SceneManagement;

public class ExampleScript1 : MonoBehaviour { private static bool created = false;

void Awake() { if (!created) { DontDestroyOnLoad(this.gameObject); created = true; Debug.Log("Awake: " + this.gameObject); } }

public void LoadScene() { if (SceneManager.GetActiveScene().name == "scene1") { SceneManager.LoadScene("scene2", LoadSceneMode.Single); } } }

ExampleScript2:

// Connected to the Cube and includes a DontDestroyOnLoad()
// LoadScene() is called by the second script and loads the first.

using UnityEngine; using UnityEngine.SceneManagement;

public class ExampleScript2 : MonoBehaviour { public void LoadScene() { if (SceneManager.GetActiveScene().name == "scene2") { SceneManager.LoadScene("scene1", LoadSceneMode.Single); } } }