#if UNITY_6000_3_OR_NEWER using System; using System.Collections.Generic; using System.Text; using UnityEditor; using UnityEditor.SceneManagement; using UnityEditor.Toolbars; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.Scripting; namespace Module.NavigationTool.Editor.Toolbar { internal static class MainToolbarScenePickerElement { private static readonly ScenePickerList SceneList = new(); [Preserve] [MainToolbarElement("Toolbar/Scene", ussName = "", defaultDockIndex = 100, defaultDockPosition = MainToolbarDockPosition.Middle, menuPriority = 1500)] public static IEnumerable Draw() { return new List(3) { CreateDropdownSceneList(), CreateToggleSceneLoad(), CreateButtonAddNewScene() }; } private static MainToolbarDropdown CreateDropdownSceneList() { SceneList.Refresh(); var content = new MainToolbarContent(GetSceneLabel()); return new MainToolbarDropdown(content, rect => { var menu = new GenericMenu(); for (var i = 0; i < SceneList.labels.Length; i++) { var sceneIndex = i; menu.AddItem(SceneList.labels[i], SceneList.selected.Contains(i), () => SelectScene(sceneIndex)); } menu.DropDown(rect); }); } private static MainToolbarToggle CreateToggleSceneLoad() { var isScenePickerSetAsAdditive = ToolbarScenePickerSettings.IsScenePickerSetAsAdditive; var content = isScenePickerSetAsAdditive ? new MainToolbarContent("A", "Additive scene loading (toogle to Single)") : new MainToolbarContent("S", "Single scene loading (toggle to Additive)"); return new MainToolbarToggle(content, isScenePickerSetAsAdditive, result => { ToolbarScenePickerSettings.IsScenePickerSetAsAdditive = result; MainToolbar.Refresh("Toolbar/Scene"); }); } private static MainToolbarButton CreateButtonAddNewScene() { var icon = EditorGUIUtility.IconContent("d_CreateAddNew").image as Texture2D; var content = new MainToolbarContent(icon, "Create a new scene"); return new MainToolbarButton(content, () => { try { var selection = EditorUtility.DisplayDialogComplex("Create new scene", "How do you want to add the scene?", "Single", "Additive", "Cancel"); if (selection == 2) return; var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, selection == 0 ? NewSceneMode.Single : NewSceneMode.Additive); if (EditorUtility.DisplayDialog("Create new scene", "Save scene to disk?", "Yes", "No")) EditorSceneManager.SaveScene(scene); } catch (Exception e) { EditorUtility.DisplayDialog("Failed to add scene", e.Message, "Ok"); } }); } private static void SelectScene(int index) { try { if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) return; var scenes = SceneList.scenes[index]; var isScenePickerSetAsAdditive = ToolbarScenePickerSettings.IsScenePickerSetAsAdditive; for (var i = 0; i < scenes.paths.Count; i++) { var path = scenes.paths[i]; var scene = SceneManager.GetSceneByPath(path); if (scenes.isGroup) { if (isScenePickerSetAsAdditive || i != 0) { EditorSceneManager.OpenScene(path, OpenSceneMode.Additive); var sceneIndex = SceneList.IndexOfPath(path, false); if (sceneIndex != -1) SceneList.selected.Add(sceneIndex); } else { EditorSceneManager.OpenScene(path, OpenSceneMode.Single); var sceneIndex = SceneList.IndexOfPath(path, false); SceneList.selected.Clear(); if (sceneIndex != -1) SceneList.selected.Add(index); } } else { if (scene.isLoaded) { if (SceneManager.sceneCount == 1) return; EditorSceneManager.CloseScene(scene, true); SceneList.selected.Remove(index); } else if (isScenePickerSetAsAdditive) { EditorSceneManager.OpenScene(path, OpenSceneMode.Additive); SceneList.selected.Add(index); } else { EditorSceneManager.OpenScene(path, OpenSceneMode.Single); SceneList.selected.Clear(); SceneList.selected.Add(index); } } } GetSceneLabel(); } catch (Exception e) { Debug.LogException(e); } finally { MainToolbar.Refresh("Toolbar/Scene"); } } private static string GetSceneLabel() { var builder = new StringBuilder(); if (SceneList.selected.Count != 0) { for (var i = 0; i < SceneList.selected.Count; i++) { if (i > 0) builder.Append(", "); builder.Append(SceneList.scenes[SceneList.selected[i]].shortname); } } else { builder.Append("Unsaved scene(s)"); } return builder.ToString(); } public static void Refresh() { MainToolbar.Refresh("Toolbar/Scene"); } } } #endif