using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; namespace Amanotes { internal class ProjectTab { private Texture2D iconScene; private Texture2D iconPlay; private Texture2D iconFolder; private GUIStyle productNameStyle; private string projectPath; private int activeSceneIndex; private void EnsureInit() { if (productNameStyle != null) return; iconScene = AssetPreview.GetMiniTypeThumbnail(typeof(SceneAsset)); iconPlay = EditorGUIUtility.FindTexture("PlayButton"); iconFolder = EditorGUIUtility.FindTexture("Folder Icon"); productNameStyle = new GUIStyle(EditorStyles.largeLabel) { alignment = TextAnchor.MiddleCenter, fontSize = 32 }; projectPath = Application.dataPath; List arr = projectPath.Split('/').ToList(); arr.RemoveAt(arr.Count - 1); if (arr.Count > 3) arr.RemoveRange(0, arr.Count - 3); projectPath = string.Join("/", arr); } internal void DrawHeader() { EnsureInit(); GUILayout.Label(PlayerSettings.productName, productNameStyle); var projectPathContent = new GUIContent(projectPath, iconFolder, "click to open folder"); if (GUILayout.Button(projectPathContent, EditorStyles.toolbarButton)) EditorUtility.RevealInFinder(Application.dataPath); } internal void OnGUI() { EnsureInit(); DrawBigPlayButton(); EditorGUILayout.Space(); DrawListScenes(); } private void DrawBigPlayButton() { EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes; if (scenes.Length == 0) { EditorGUILayout.HelpBox("No scene in Build Setting!", MessageType.Warning); return; } EditorBuildSettingsScene scene = scenes[activeSceneIndex]; GUILayout.BeginHorizontal(); { EditorGUILayout.Space(); GUILayout.BeginVertical(); { GUILayout.Space(16); GUILayout.Label(scene.path); activeSceneIndex = EditorGUILayout.IntSlider(activeSceneIndex, 0, scenes.Length - 1); } GUILayout.EndVertical(); if (GUILayout.Button(iconPlay, GUILayout.Width(64f), GUILayout.Height(64f))) OpenScene(scene.path, true); } GUILayout.EndHorizontal(); } private void DrawListScenes() { EditorBuildSettingsScene[] listScenes = EditorBuildSettings.scenes; GUILayout.BeginVertical(); for (var i = 0; i < listScenes.Length; i++) { EditorBuildSettingsScene scene = listScenes[i]; if (!scene.enabled) continue; GUILayout.BeginHorizontal(); { var asset = AssetDatabase.LoadAssetAtPath(scene.path); if (GUILayout.Button(iconScene, EditorStyles.toolbarButton, GUILayout.Width(25f))) OpenScene(scene.path, false); EditorGUILayout.ObjectField(asset, typeof(SceneAsset), false); if (GUILayout.Button(iconPlay, EditorStyles.toolbarButton, GUILayout.Width(25f))) OpenScene(scene.path, true); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); } private static void OpenScene(string scenePath, bool play) { if (EditorApplication.isPlaying) { EditorApplication.isPlaying = false; return; } EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo(); EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single); if (play) EditorApplication.isPlaying = true; } } }