From 5210c1d36b62dda7f78b0fd458653f14b4c8d1a9 Mon Sep 17 00:00:00 2001 From: Alex-Rachel <574809918@qq.com> Date: Wed, 19 Mar 2025 21:12:28 +0800 Subject: [PATCH] ToolbarExtender ToolbarExtender --- .../Assets/Editor/ToolbarExtender.meta | 8 ++ .../Editor/ToolbarExtender/Custom.meta | 0 .../ToolbarExtender/Custom/SceneSwitcher.meta | 0 .../Custom/SceneSwitcher/Editor.meta | 0 .../SceneSwitcher/Editor/EditorPlayMode.cs | 0 .../Editor/EditorPlayMode.cs.meta | 0 .../SceneSwitcher/Editor/SceneLauncher.cs | 126 ++++++++++++++++++ .../Editor/SceneLauncher.cs.meta | 3 + .../SceneSwitcher/Editor/SceneSwitcher.cs | 115 ++++++++++++++++ .../Editor/SceneSwitcher.cs.meta | 0 .../Editor/ToolbarExtender/ToolbarCallback.cs | 0 .../ToolbarExtender/ToolbarCallback.cs.meta | 0 .../Editor/ToolbarExtender/ToolbarExtender.cs | 0 .../ToolbarExtender/ToolbarExtender.cs.meta | 0 .../TEngine/Editor/ToolbarExtender.meta | 3 - .../SceneSwitcher/Editor/SceneSwitcher.cs | 84 ------------ 16 files changed, 252 insertions(+), 87 deletions(-) create mode 100644 UnityProject/Assets/Editor/ToolbarExtender.meta rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/Custom.meta (100%) rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/Custom/SceneSwitcher.meta (100%) rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor.meta (100%) rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs (100%) rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs.meta (100%) create mode 100644 UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneLauncher.cs create mode 100644 UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneLauncher.cs.meta create mode 100644 UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs.meta (100%) rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/ToolbarCallback.cs (100%) rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/ToolbarCallback.cs.meta (100%) rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/ToolbarExtender.cs (100%) rename UnityProject/Assets/{TEngine => }/Editor/ToolbarExtender/ToolbarExtender.cs.meta (100%) delete mode 100644 UnityProject/Assets/TEngine/Editor/ToolbarExtender.meta delete mode 100644 UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs diff --git a/UnityProject/Assets/Editor/ToolbarExtender.meta b/UnityProject/Assets/Editor/ToolbarExtender.meta new file mode 100644 index 00000000..36d56074 --- /dev/null +++ b/UnityProject/Assets/Editor/ToolbarExtender.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2982073ed28ef744e96be44c7f55f5f7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom.meta b/UnityProject/Assets/Editor/ToolbarExtender/Custom.meta similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom.meta rename to UnityProject/Assets/Editor/ToolbarExtender/Custom.meta diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher.meta b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher.meta similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher.meta rename to UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher.meta diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor.meta b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor.meta similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor.meta rename to UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor.meta diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs rename to UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs.meta b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs.meta similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs.meta rename to UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/EditorPlayMode.cs.meta diff --git a/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneLauncher.cs b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneLauncher.cs new file mode 100644 index 00000000..9510ba77 --- /dev/null +++ b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneLauncher.cs @@ -0,0 +1,126 @@ +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityToolbarExtender; + +namespace TEngine.SceneLauncher +{ + [InitializeOnLoad] + public class SceneSwitchLeftButton + { + private const string PreviousSceneKey = "TEngine_PreviousScenePath"; // 用于存储之前场景路径的键 + private const string IsLauncherBtn = "TEngine_IsLauncher"; // 用于存储之前是否按下launcher + + private static readonly string SceneMain = "main"; + + private static readonly string ButtonStyleName = "Tab middle"; + private static GUIStyle _buttonGuiStyle; + + static SceneSwitchLeftButton() + { + ToolbarExtender.LeftToolbarGUI.Add(OnToolbarGUI); + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + EditorApplication.quitting += OnEditorQuit; + } + + private static void OnToolbarGUI() + { + _buttonGuiStyle ??= new GUIStyle(ButtonStyleName) + { + padding = new RectOffset(2, 8, 2, 2), + alignment = TextAnchor.MiddleCenter, + fontStyle = FontStyle.Bold + }; + + GUILayout.FlexibleSpace(); + if (GUILayout.Button( + new GUIContent("Launcher", EditorGUIUtility.FindTexture("PlayButton"), "Start Scene Launcher"), + _buttonGuiStyle)) + SceneHelper.StartScene(SceneMain); + } + + private static void OnPlayModeStateChanged(PlayModeStateChange state) + { + if (state == PlayModeStateChange.EnteredEditMode) + { + // 从 EditorPrefs 读取之前的场景路径 + var previousScenePath = EditorPrefs.GetString(PreviousSceneKey, string.Empty); + if (!string.IsNullOrEmpty(previousScenePath) && EditorPrefs.GetBool(IsLauncherBtn)) + { + EditorApplication.delayCall += () => + { + if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) + EditorSceneManager.OpenScene(previousScenePath); + }; + } + + EditorPrefs.SetBool(IsLauncherBtn, false); + } + } + + private static void OnEditorQuit() + { + EditorPrefs.SetString(PreviousSceneKey, ""); + EditorPrefs.SetBool(IsLauncherBtn, false); + } + + private static class SceneHelper + { + private static string _sceneToOpen; + + public static void StartScene(string sceneName) + { + if (EditorApplication.isPlaying) EditorApplication.isPlaying = false; + + // 记录当前场景路径到 EditorPrefs + var activeScene = SceneManager.GetActiveScene(); + if (activeScene.isLoaded && activeScene.name != SceneMain) + { + EditorPrefs.SetString(PreviousSceneKey, activeScene.path); + EditorPrefs.SetBool(IsLauncherBtn, true); + } + + _sceneToOpen = sceneName; + EditorApplication.update += OnUpdate; + } + + private static void OnUpdate() + { + if (_sceneToOpen == null || + EditorApplication.isPlaying || EditorApplication.isPaused || + EditorApplication.isCompiling || EditorApplication.isPlayingOrWillChangePlaymode) + return; + + EditorApplication.update -= OnUpdate; + + if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) + { + string[] guids = AssetDatabase.FindAssets("t:scene " + _sceneToOpen, null); + if (guids.Length == 0) + { + Debug.LogWarning("Couldn't find scene file"); + } + else + { + string scenePath = null; + // 优先打开完全匹配_sceneToOpen的场景 + for (var i = 0; i < guids.Length; i++) + { + scenePath = AssetDatabase.GUIDToAssetPath(guids[i]); + if (scenePath.EndsWith("/" + _sceneToOpen + ".unity")) break; + } + + // 如果没有完全匹配的场景,默认显示找到的第一个场景 + if (string.IsNullOrEmpty(scenePath)) scenePath = AssetDatabase.GUIDToAssetPath(guids[0]); + + EditorSceneManager.OpenScene(scenePath); + EditorApplication.isPlaying = true; + } + } + + _sceneToOpen = null; + } + } + } +} \ No newline at end of file diff --git a/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneLauncher.cs.meta b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneLauncher.cs.meta new file mode 100644 index 00000000..baab37f9 --- /dev/null +++ b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneLauncher.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2f6d2ca3d3b34950a79294e49dd9d016 +timeCreated: 1742389721 \ No newline at end of file diff --git a/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs new file mode 100644 index 00000000..53230e9b --- /dev/null +++ b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs @@ -0,0 +1,115 @@ +#if UNITY_EDITOR +using System.Collections.Generic; +using System.IO; +using UnityEngine; +using UnityEditor; +using UnityEngine.SceneManagement; +using UnityEditor.SceneManagement; + +namespace UnityToolbarExtender.Examples +{ + [InitializeOnLoad] + public sealed class SceneSwitchLeftButton + { + private static List<(string sceneName, string scenePath)> m_Scenes; + private static string[] m_SceneName; + private static string[] m_ScenePath; + private static int sceneSelected = 0; + + static SceneSwitchLeftButton() + { + EditorApplication.projectChanged += UpdateCurrent; + UpdateCurrent(); + ToolbarExtender.RightToolbarGUI.Add(OnToolbarGUI); + } + + static void UpdateCurrent() + { + m_Scenes = SceneSwitcher.GetAllScenesInProject(); + m_SceneName = new string[m_Scenes.Count]; + m_ScenePath = new string[m_Scenes.Count]; + for (int i = 0; i < m_Scenes.Count; i++) + { + var (name, path) = m_Scenes[i]; + m_SceneName[i] = name; + m_ScenePath[i] = path; + if (SceneManager.GetActiveScene().path == path) + sceneSelected = i; + } + } + + static void OnToolbarGUI() + { + if (sceneSelected >= m_SceneName.Length) //空项目0场景判断 + return; + var size = EditorStyles.popup.CalcSize(new GUIContent(m_SceneName[sceneSelected])); + // 创建水平布局 + //EditorGUILayout.BeginHorizontal(); + + // 将控件推到左边和右边 + //GUILayout.FlexibleSpace(); // 先占用左边的所有空间 + EditorGUILayout.LabelField("当前场景:", GUILayout.Width(55)); + int sceneSelectedNew = EditorGUILayout.Popup(sceneSelected, m_SceneName, GUILayout.Width(size.x + 5f), + GUILayout.MinWidth(55)); + GUILayout.FlexibleSpace(); + // 结束水平布局 + //EditorGUILayout.EndHorizontal(); + if (sceneSelectedNew != sceneSelected) + { + sceneSelected = sceneSelectedNew; + SceneSwitcher.PromptSaveCurrentScene(); + EditorSceneManager.OpenScene(m_ScenePath[sceneSelectedNew]); + } + } + } + + static class SceneSwitcher + { + public static bool PromptSaveCurrentScene() + { + // 检查当前场景是否已保存 + if (SceneManager.GetActiveScene().isDirty) + { + // 提示用户是否要保存当前场景 + bool saveScene = EditorUtility.DisplayDialog( + "Save Current Scene", + "The current scene has unsaved changes. Do you want to save it?", + "Save", + "Cancel" + ); + + // 如果用户选择“保存”,则保存当前场景 + if (saveScene) + { + EditorSceneManager.SaveScene(SceneManager.GetActiveScene()); + } + + return saveScene; + } + + // 如果场景已保存或者用户选择了“取消”,则返回 true,表示继续执行后续操作 + return true; + } + + /// + /// 获取项目中所有的场景文件,并以 (场景名, 场景路径) 的形式返回。 + /// + public static List<(string sceneName, string scenePath)> GetAllScenesInProject() + { + List<(string sceneName, string scenePath)> scenes = new List<(string sceneName, string scenePath)>(); + + // 查找所有场景文件 + string[] guids = AssetDatabase.FindAssets("t:Scene"); + for (int i = 0; i < guids.Length; i++) + { + var guid = guids[i]; + string path = AssetDatabase.GUIDToAssetPath(guid); + string sceneName = $"{i + 1}_{Path.GetFileNameWithoutExtension(path)}"; + scenes.Add((sceneName, path)); + } + + return scenes; + } + } +} +#endif \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs.meta b/UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs.meta similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs.meta rename to UnityProject/Assets/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs.meta diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/ToolbarCallback.cs b/UnityProject/Assets/Editor/ToolbarExtender/ToolbarCallback.cs similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/ToolbarCallback.cs rename to UnityProject/Assets/Editor/ToolbarExtender/ToolbarCallback.cs diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/ToolbarCallback.cs.meta b/UnityProject/Assets/Editor/ToolbarExtender/ToolbarCallback.cs.meta similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/ToolbarCallback.cs.meta rename to UnityProject/Assets/Editor/ToolbarExtender/ToolbarCallback.cs.meta diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/ToolbarExtender.cs b/UnityProject/Assets/Editor/ToolbarExtender/ToolbarExtender.cs similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/ToolbarExtender.cs rename to UnityProject/Assets/Editor/ToolbarExtender/ToolbarExtender.cs diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/ToolbarExtender.cs.meta b/UnityProject/Assets/Editor/ToolbarExtender/ToolbarExtender.cs.meta similarity index 100% rename from UnityProject/Assets/TEngine/Editor/ToolbarExtender/ToolbarExtender.cs.meta rename to UnityProject/Assets/Editor/ToolbarExtender/ToolbarExtender.cs.meta diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender.meta b/UnityProject/Assets/TEngine/Editor/ToolbarExtender.meta deleted file mode 100644 index d1f16752..00000000 --- a/UnityProject/Assets/TEngine/Editor/ToolbarExtender.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: d4139bd1a1fd4d258b671e8e45fdd9f7 -timeCreated: 1705986748 \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs b/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs deleted file mode 100644 index 9da46f7b..00000000 --- a/UnityProject/Assets/TEngine/Editor/ToolbarExtender/Custom/SceneSwitcher/Editor/SceneSwitcher.cs +++ /dev/null @@ -1,84 +0,0 @@ -using UnityEditor; -using UnityEditor.SceneManagement; -using UnityEngine; -using UnityToolbarExtender; - -namespace TEngine -{ - [InitializeOnLoad] - public class SceneSwitchLeftButton - { - private static readonly string SceneMain = "main"; - - static SceneSwitchLeftButton() - { - ToolbarExtender.LeftToolbarGUI.Add(OnToolbarGUI); - } - - static readonly string ButtonStyleName = "Tab middle"; - static GUIStyle _buttonGuiStyle; - - static void OnToolbarGUI() - { - _buttonGuiStyle ??= new GUIStyle(ButtonStyleName) - { - padding = new RectOffset(2, 8, 2, 2), - alignment = TextAnchor.MiddleCenter, - fontStyle = FontStyle.Bold - }; - - GUILayout.FlexibleSpace(); - if (GUILayout.Button( - new GUIContent("Launcher", EditorGUIUtility.FindTexture("PlayButton"), $"Start Scene Launcher"), - _buttonGuiStyle)) - { - SceneHelper.StartScene(SceneMain); - } - } - } - - static class SceneHelper - { - static string _sceneToOpen; - - public static void StartScene(string sceneName) - { - if (EditorApplication.isPlaying) - { - EditorApplication.isPlaying = false; - } - - _sceneToOpen = sceneName; - EditorApplication.update += OnUpdate; - } - - static void OnUpdate() - { - if (_sceneToOpen == null || - EditorApplication.isPlaying || EditorApplication.isPaused || - EditorApplication.isCompiling || EditorApplication.isPlayingOrWillChangePlaymode) - { - return; - } - - EditorApplication.update -= OnUpdate; - - if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) - { - string[] guids = AssetDatabase.FindAssets("t:scene " + _sceneToOpen, null); - if (guids.Length == 0) - { - Debug.LogWarning("Couldn't find scene file"); - } - else - { - string scenePath = AssetDatabase.GUIDToAssetPath(guids[0]); - EditorSceneManager.OpenScene(scenePath); - EditorApplication.isPlaying = true; - } - } - - _sceneToOpen = null; - } - } -} \ No newline at end of file