// GDnD wiki example // Demonstrates: a persistent object with DontDestroyOnLoad, a duplicate guard and the SceneManager.sceneLoaded event // Related pages: [[unity-scene-management]], [[unity-gamemanager-pattern]] using UnityEngine; using UnityEngine.SceneManagement; // Place this in the Title scene only. It survives every later scene load and // remembers which level was played, so a separate GameOver scene can offer "Retry". public class GameSession : MonoBehaviour { public static GameSession Instance { get; private set; } public string LastLevelScene { get; private set; } public bool LastRunWon { get; private set; } public int Attempts { get; private set; } private void Awake() { // Returning to the Title scene loads a second GameSession: keep the first one. if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); // must be a root GameObject } private void OnEnable() { SceneManager.sceneLoaded += HandleSceneLoaded; } private void OnDisable() { SceneManager.sceneLoaded -= HandleSceneLoaded; } private void OnDestroy() { if (Instance == this) { Instance = null; } } public void RecordResult(string levelSceneName, bool won) { LastLevelScene = levelSceneName; LastRunWon = won; Attempts++; } // Runs after the new scene's Awake and OnEnable calls, before its Start calls. private void HandleSceneLoaded(Scene scene, LoadSceneMode mode) { if (Instance != this) { return; // a duplicate that is about to be destroyed } Time.timeScale = 1f; // second safety net for the frozen-scene bug Debug.Log("Loaded '" + scene.name + "' (build index " + scene.buildIndex + ", " + mode + "). Attempts so far: " + Attempts); } }