Bird
Raised Fist0
Unityframework~5 mins

DontDestroyOnLoad usage in Unity - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does DontDestroyOnLoad do in Unity?

DontDestroyOnLoad keeps a GameObject alive when loading a new scene. It prevents the object from being destroyed.

Click to reveal answer
beginner
How do you use DontDestroyOnLoad in a script?

Call DontDestroyOnLoad(gameObject); inside a script, usually in Awake() or Start() method.

Click to reveal answer
beginner
Why would you use DontDestroyOnLoad for a GameObject?

To keep important objects like managers, audio players, or player data alive across multiple scenes.

Click to reveal answer
intermediate
What happens if you use DontDestroyOnLoad on multiple instances of the same GameObject?

You may end up with duplicates in your game. Usually, you want to check and keep only one instance.

Click to reveal answer
intermediate
Can DontDestroyOnLoad be used on child GameObjects?

Yes, it can be used on child GameObjects. It preserves the child and its descendants, detaching it from the parent if the parent is destroyed.

Click to reveal answer
What is the main purpose of DontDestroyOnLoad in Unity?
AKeep a GameObject alive between scene loads
BDestroy a GameObject immediately
CLoad a new scene asynchronously
DReset a GameObject's position
Where is the best place to call DontDestroyOnLoad(gameObject); in a script?
AInside <code>Awake()</code> or <code>Start()</code>
BInside <code>Update()</code>
CInside <code>OnDestroy()</code>
DInside <code>OnEnable()</code>
What problem can happen if you don't manage multiple instances of a DontDestroyOnLoad object?
AThe scene fails to load
BMultiple duplicates of the object appear
CThe object is destroyed immediately
DThe object loses its components
Can DontDestroyOnLoad be applied to a child GameObject directly?
AOnly if the child is active
BOnly if the child has a Rigidbody
CYes, any GameObject can be preserved
DNo, only root GameObjects can be preserved
Which of these is a common use case for DontDestroyOnLoad?
AChanging scene lighting settings
BResetting player position on scene load
CDestroying enemies when a scene loads
DKeeping a music player alive across scenes
Explain how and why you would use DontDestroyOnLoad in a Unity project.
Think about objects that should not reset when changing scenes.
You got /4 concepts.
    Describe a potential problem when using DontDestroyOnLoad without proper management and how to fix it.
    Consider what happens if multiple scenes create the same persistent object.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using DontDestroyOnLoad in Unity?
      easy
      A. To pause the game during scene loading
      B. To destroy a GameObject immediately
      C. To load a new scene asynchronously
      D. To keep a GameObject alive when switching scenes

      Solution

      1. Step 1: Understand what DontDestroyOnLoad does

        This method prevents a GameObject from being destroyed when a new scene loads.
      2. Step 2: Identify the purpose in scene management

        It keeps important objects like music players or managers alive across scenes.
      3. Final Answer:

        To keep a GameObject alive when switching scenes -> Option D
      4. Quick Check:

        DontDestroyOnLoad keeps objects alive = A [OK]
      Hint: Remember: DontDestroyOnLoad means object stays between scenes [OK]
      Common Mistakes:
      • Thinking it destroys objects instead of preserving them
      • Confusing it with scene loading functions
      • Assuming it pauses the game
      2. Which of the following is the correct way to use DontDestroyOnLoad in a Unity script?
      easy
      A. DontDestroyOnLoad(this);
      B. DontDestroyOnLoad(Scene);
      C. DontDestroyOnLoad(gameObject);
      D. DontDestroyOnLoad(SceneManager);

      Solution

      1. Step 1: Identify the correct parameter for DontDestroyOnLoad

        The method requires a GameObject to keep alive, usually referenced as gameObject in scripts.
      2. Step 2: Check each option

        DontDestroyOnLoad(gameObject); uses gameObject, which is correct. DontDestroyOnLoad(this); uses this (the script), which is incorrect. Options B and C use unrelated types.
      3. Final Answer:

        DontDestroyOnLoad(gameObject); -> Option C
      4. Quick Check:

        Use gameObject with DontDestroyOnLoad = D [OK]
      Hint: Use gameObject, not this or Scene, with DontDestroyOnLoad [OK]
      Common Mistakes:
      • Passing 'this' instead of 'gameObject'
      • Trying to pass Scene or SceneManager objects
      • Calling DontDestroyOnLoad without parameters
      3. Consider this Unity C# script attached to a GameObject:
      void Awake() {
          DontDestroyOnLoad(gameObject);
      }
      
      void Start() {
          Debug.Log("Object alive");
      }
      What will happen when the scene changes?
      medium
      A. The GameObject will persist and "Object alive" will print once
      B. The GameObject will be destroyed and "Object alive" will not print again
      C. The GameObject will persist and "Object alive" will print every scene load
      D. The GameObject will be duplicated on each scene load

      Solution

      1. Step 1: Understand when Awake and Start run

        Awake runs once when the object is created. Start runs once after Awake. Both run only once per object lifetime.
      2. Step 2: Effect of DontDestroyOnLoad on scene change

        The GameObject is kept alive across scenes, so Awake and Start do not run again on scene load.
      3. Final Answer:

        The GameObject will persist and "Object alive" will print once -> Option A
      4. Quick Check:

        DontDestroyOnLoad keeps object alive, Awake/Start run once = A [OK]
      Hint: Awake/Start run once; object stays alive with DontDestroyOnLoad [OK]
      Common Mistakes:
      • Thinking Start runs on every scene load
      • Assuming object duplicates on scene change
      • Believing object is destroyed on scene change
      4. You wrote this code in a Unity script:
      void Start() {
          DontDestroyOnLoad(this);
      }
      What is the problem and how to fix it?
      medium
      A. Error: DontDestroyOnLoad must be called in Awake, not Start
      B. Error: 'this' is not a GameObject; fix by using DontDestroyOnLoad(gameObject);
      C. No problem; code works fine as is
      D. Error: DontDestroyOnLoad requires a Scene parameter

      Solution

      1. Step 1: Identify the parameter type for DontDestroyOnLoad

        DontDestroyOnLoad requires a GameObject, but 'this' refers to the script instance, not the GameObject.
      2. Step 2: Correct the parameter

        Use gameObject to pass the GameObject the script is attached to.
      3. Final Answer:

        Error: 'this' is not a GameObject; fix by using DontDestroyOnLoad(gameObject); -> Option B
      4. Quick Check:

        DontDestroyOnLoad needs gameObject, not this = C [OK]
      Hint: Pass gameObject, not this, to DontDestroyOnLoad [OK]
      Common Mistakes:
      • Passing 'this' instead of 'gameObject'
      • Thinking DontDestroyOnLoad must be in Awake only
      • Passing wrong types like Scene or SceneManager
      5. You want to keep a music player GameObject alive across scenes but avoid duplicates if the scene reloads. Which code snippet correctly implements this using DontDestroyOnLoad?
      hard
      A. void Awake() { if (FindObjectsOfType<MusicPlayer>().Length > 1) { Destroy(gameObject); } else { DontDestroyOnLoad(gameObject); } }
      B. void Awake() { DontDestroyOnLoad(gameObject); }
      C. void Start() { Destroy(gameObject); DontDestroyOnLoad(gameObject); }
      D. void Awake() { Destroy(gameObject); }

      Solution

      1. Step 1: Understand the problem of duplicates

        Using DontDestroyOnLoad alone keeps the object alive, but reloading the scene creates duplicates.
      2. Step 2: Use a check to destroy duplicates

        void Awake() { if (FindObjectsOfType<MusicPlayer>().Length > 1) { Destroy(gameObject); } else { DontDestroyOnLoad(gameObject); } } checks if more than one MusicPlayer exists and destroys the extra one, preventing duplicates.
      3. Step 3: Verify other options

        void Awake() { DontDestroyOnLoad(gameObject); } keeps duplicates. void Start() { Destroy(gameObject); DontDestroyOnLoad(gameObject); } destroys then calls DontDestroyOnLoad (wrong order). void Awake() { Destroy(gameObject); } destroys always.
      4. Final Answer:

        void Awake() { if (FindObjectsOfType<MusicPlayer>().Length > 1) { Destroy(gameObject); } else { DontDestroyOnLoad(gameObject); } } -> Option A
      5. Quick Check:

        Check duplicates before DontDestroyOnLoad to avoid duplicates = B [OK]
      Hint: Check existing objects before DontDestroyOnLoad to prevent duplicates [OK]
      Common Mistakes:
      • Not checking for duplicates causing multiple music players
      • Destroying object before calling DontDestroyOnLoad
      • Calling DontDestroyOnLoad without duplicate check
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard