module-navigation-tool/Editor/Toolbar/Tools/ToolScenePicker.cs

103 lines
3.2 KiB
C#

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<string>(scenes.Length);
var listPaths = new List<string>(scenes.Length);
for (var i = 0; i < scenes.Length; i++)
{
if (string.IsNullOrEmpty(scenes[i].path))
continue;
listNames.Add($"{Path.GetFileNameWithoutExtension(scenes[i].path)} (Build Settings)");
listPaths.Add(scenes[i].path);
}
string[] guids = AssetDatabase.FindAssets("t:scene");
int startIndex = listNames.Count;
for (var i = 0; i < guids.Length; i++)
{
string path = AssetDatabase.GUIDToAssetPath(guids[i]);
var scene = AssetDatabase.LoadAssetAtPath<SceneAsset>(path);
if (scene == null || listPaths.Contains(path))
continue;
listNames.Add(path.Substring(7, path.Length - 13).Replace('/', '\\'));
listPaths.Add(path);
}
if (startIndex < listNames.Count)
{
listNames.Insert(startIndex, string.Empty);
listPaths.Insert(startIndex, string.Empty);
}
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)
{
string path = PATHS[temp];
if (string.IsNullOrEmpty(path))
return;
SELECTED_INDEX = temp;
EditorSceneManager.OpenScene(PATHS[SELECTED_INDEX], OpenSceneMode.Single);
}
}
public float CalculateWidth()
{
return 100.0f;
}
public static void SetAsDirty()
{
IS_DIRTY = true;
}
}
}