using System.Collections.Generic; using System.IO; using Game.NavigationTool.Editor.Toolbar; using JetBrains.Annotations; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; namespace Game.NavigationTool.Editor.Tools { [UsedImplicitly] internal sealed class ToolScenePicker : IToolbarDrawer { public bool Visible => true; public bool Enabled => !EditorApplication.isPlaying && !EditorApplication.isPlayingOrWillChangePlaymode; public EToolbarPlacement Placement => EToolbarPlacement.Right; private static bool IS_DIRTY = true; private static int SELECTED_INDEX = -1; private static string[] OPTIONS = new string[0]; private static string[] PATHS = new string[0]; private void Initialize() { if (!IS_DIRTY) return; EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes; var listNames = new List(scenes.Length); var listPaths = new List(scenes.Length); for (var i = 0; i < scenes.Length; i++) { if (string.IsNullOrEmpty(scenes[i].path)) continue; listNames.Add(Path.GetFileNameWithoutExtension(scenes[i].path)); listPaths.Add(scenes[i].path); } OPTIONS = listNames.ToArray(); PATHS = listPaths.ToArray(); Scene activeScene = SceneManager.GetActiveScene(); SELECTED_INDEX = listPaths.IndexOf(activeScene.path); IS_DIRTY = false; } public void Update() { Initialize(); } public void Draw(Rect rect, Styles styles) { Initialize(); int temp = EditorGUI.Popup(rect, SELECTED_INDEX, OPTIONS, styles.popup); if (temp != -1 && temp != SELECTED_INDEX && OPTIONS.Length != 0) { SELECTED_INDEX = temp; EditorSceneManager.OpenScene(PATHS[SELECTED_INDEX], OpenSceneMode.Single); } } public float CalculateWidth() { return 100.0f; } public static void SetAsDirty() { IS_DIRTY = true; } } }