Last active
October 25, 2024 15:00
-
-
Save ClintChil/92f4785c4bc3f3b64296b7eeffe94605 to your computer and use it in GitHub Desktop.
Unity SceneAutoLoader Script from http://wiki.unity3d.com/index.php/SceneAutoLoader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using UnityEditor; | |
/// <summary> | |
/// Scene auto loader. | |
/// </summary> | |
/// <description> | |
/// This class adds a File > Scene Autoload menu containing options to select | |
/// a "master scene" enable it to be auto-loaded when the user presses play | |
/// in the editor. When enabled, the selected scene will be loaded on play, | |
/// then the original scene will be reloaded on stop. | |
/// | |
/// Based on an idea on this thread: | |
/// http://forum.unity3d.com/threads/157502-Executing-first-scene-in-build-settings-when-pressing-play-button-in-editor | |
/// </description> | |
[InitializeOnLoad] | |
static class SceneAutoLoader | |
{ | |
// Static constructor binds a playmode-changed callback. | |
// [InitializeOnLoad] above makes sure this gets executed. | |
static SceneAutoLoader() | |
{ | |
EditorApplication.playmodeStateChanged += OnPlayModeChanged; | |
} | |
// Menu items to select the "master" scene and control whether or not to load it. | |
[MenuItem("File/Scene Autoload/Select Master Scene...")] | |
private static void SelectMasterScene() | |
{ | |
string masterScene = EditorUtility.OpenFilePanel("Select Master Scene", Application.dataPath, "unity"); | |
masterScene = masterScene.Replace(Application.dataPath, "Assets/"); //project relative instead of absolute path | |
if (!string.IsNullOrEmpty(masterScene)) | |
{ | |
MasterScene = masterScene; | |
LoadMasterOnPlay = true; | |
} | |
} | |
[MenuItem("File/Scene Autoload/Load Master On Play", true)] | |
private static bool ShowLoadMasterOnPlay() | |
{ | |
return !LoadMasterOnPlay; | |
} | |
[MenuItem("File/Scene Autoload/Load Master On Play")] | |
private static void EnableLoadMasterOnPlay() | |
{ | |
LoadMasterOnPlay = true; | |
} | |
[MenuItem("File/Scene Autoload/Don't Load Master On Play", true)] | |
private static bool ShowDontLoadMasterOnPlay() | |
{ | |
return LoadMasterOnPlay; | |
} | |
[MenuItem("File/Scene Autoload/Don't Load Master On Play")] | |
private static void DisableLoadMasterOnPlay() | |
{ | |
LoadMasterOnPlay = false; | |
} | |
// Play mode change callback handles the scene load/reload. | |
private static void OnPlayModeChanged() | |
{ | |
if (!LoadMasterOnPlay) | |
{ | |
return; | |
} | |
if (!EditorApplication.isPlaying && EditorApplication.isPlayingOrWillChangePlaymode) | |
{ | |
// User pressed play -- autoload master scene. | |
PreviousScene = EditorApplication.currentScene; | |
if (EditorApplication.SaveCurrentSceneIfUserWantsTo()) | |
{ | |
if (!EditorApplication.OpenScene(MasterScene)) | |
{ | |
Debug.LogError(string.Format("error: scene not found: {0}", MasterScene)); | |
EditorApplication.isPlaying = false; | |
} | |
} | |
else | |
{ | |
// User cancelled the save operation -- cancel play as well. | |
EditorApplication.isPlaying = false; | |
} | |
} | |
if (EditorApplication.isPlaying && !EditorApplication.isPlayingOrWillChangePlaymode) | |
{ | |
// User pressed stop -- reload previous scene. | |
if (!EditorApplication.OpenScene(PreviousScene)) | |
{ | |
Debug.LogError(string.Format("error: scene not found: {0}", PreviousScene)); | |
} | |
} | |
} | |
// Properties are remembered as editor preferences. | |
private const string cEditorPrefLoadMasterOnPlay = "SceneAutoLoader.LoadMasterOnPlay"; | |
private const string cEditorPrefMasterScene = "SceneAutoLoader.MasterScene"; | |
private const string cEditorPrefPreviousScene = "SceneAutoLoader.PreviousScene"; | |
private static bool LoadMasterOnPlay | |
{ | |
get { return EditorPrefs.GetBool(cEditorPrefLoadMasterOnPlay, false); } | |
set { EditorPrefs.SetBool(cEditorPrefLoadMasterOnPlay, value); } | |
} | |
private static string MasterScene | |
{ | |
get { return EditorPrefs.GetString(cEditorPrefMasterScene, "Master.unity"); } | |
set { EditorPrefs.SetString(cEditorPrefMasterScene, value); } | |
} | |
private static string PreviousScene | |
{ | |
get { return EditorPrefs.GetString(cEditorPrefPreviousScene, EditorApplication.currentScene); } | |
set { EditorPrefs.SetString(cEditorPrefPreviousScene, value); } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This script i use heavily. Unfortunately it is outdated. I did create an updated version that works with unity 2023(unity 6)
Is it OK if i publish it for free to the unity asset store? I will be sure to give credit to you for creating it.