// GDnD wiki example // Demonstrates: loading scenes by name and build index, restarting, returning to the menu and quitting (Unity 6) // Related pages: [[unity-scene-management]], [[unity-gamemanager-pattern]] using UnityEngine; using UnityEngine.SceneManagement; // Put one SceneFlow on a GameObject in every scene that has buttons, then wire // each Button's On Click () to one of the public methods below. public class SceneFlow : MonoBehaviour { [SerializeField] private string menuSceneName = "Title"; [SerializeField] private string firstLevelSceneName = "Level1"; public void StartGame() { LoadScene(firstLevelSceneName); } public void LoadMenu() { LoadScene(menuSceneName); } // Reload the scene that is open now. Using the build index avoids typos in names. public void Restart() { LoadByIndex(SceneManager.GetActiveScene().buildIndex); } // Load the next scene in the Build Profiles scene list, or go back to the menu after the last one. public void LoadNextLevel() { int next = SceneManager.GetActiveScene().buildIndex + 1; if (next < SceneManager.sceneCountInBuildSettings) { LoadByIndex(next); } else { LoadMenu(); } } // From a GameOver or Win scene, the active scene is no longer the level, // so ask the persistent GameSession which level was played last. public void RetryLastLevel() { if (GameSession.Instance != null && !string.IsNullOrEmpty(GameSession.Instance.LastLevelScene)) { LoadScene(GameSession.Instance.LastLevelScene); } else { StartGame(); } } // Takes a string, so a Button's On Click () can pass any scene name typed in the Inspector. public void LoadScene(string sceneName) { if (!Application.CanStreamedLevelBeLoaded(sceneName)) { Debug.LogError("Scene '" + sceneName + "' is not in the scene list. Add it in File > Build Profiles."); return; } Time.timeScale = 1f; // a paused or slowed game must not stay frozen in the next scene SceneManager.LoadScene(sceneName); } private void LoadByIndex(int buildIndex) { if (!Application.CanStreamedLevelBeLoaded(buildIndex)) { Debug.LogError("No scene at build index " + buildIndex + ". Check the scene list in File > Build Profiles."); return; } Time.timeScale = 1f; SceneManager.LoadScene(buildIndex); } public void Quit() { Debug.Log("Quit requested (ignored in the Editor)."); Application.Quit(); } }