Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using UnityEditor;
- using UnityEngine;
- public struct SceneInfo
- {
- public string FolderName;
- public string SceneName;
- public string ScenePath;
- }
- public class ScenelistWindow : EditorWindow
- {
- ScenenlistSerializeable instance;
- private Vector2 _scrollPosition;
- private static readonly string RootFolder = "Assets";
- private readonly List<SceneInfo> Scenes = new List<SceneInfo>();
- List<string> OnlySceneNames = new List<string>();
- int QuickSwitch1SceneListID = 0;
- int QuickSwitch2SceneListID = 0;
- bool dropDownSceneList = false;
- string scriptFolderDataPath = "";
- [MenuItem("Window/ShowScenes")]
- public static void Init()
- {
- GetWindow(typeof(ScenelistWindow), false, "Scenes");
- }
- string m_ScriptFilePath;
- string m_ScriptFolder;
- string GetScriptAssetPath()
- {
- var tmpInstance = CreateInstance<ScenenlistSerializeable>();
- MonoScript ms = MonoScript.FromScriptableObject(tmpInstance);
- m_ScriptFilePath = AssetDatabase.GetAssetPath(ms);
- //FileInfo fi = new FileInfo(m_ScriptFilePath);
- //m_ScriptFolder = fi.Directory.ToString();
- //m_ScriptFolder.Replace('\\', '/');
- // Asset/.../Folder
- return m_ScriptFilePath.Substring(0, m_ScriptFilePath.LastIndexOf("/"));
- }
- void OnEnable()
- {
- LoadData();
- SearchForScenes();
- }
- void OnDisable()
- {
- SaveData();
- }
- void LoadData()
- {
- scriptFolderDataPath = GetScriptAssetPath() + "/ScenenlistData.asset";
- instance = AssetDatabase.LoadAssetAtPath<ScenenlistSerializeable>(scriptFolderDataPath);
- if(instance == null) {
- instance = CreateInstance<ScenenlistSerializeable>();
- EditorUtility.SetDirty(instance);
- AssetDatabase.CreateAsset(instance, scriptFolderDataPath);
- AssetDatabase.SaveAssets();
- AssetDatabase.Refresh();
- }
- else {
- QuickSwitch1SceneListID = instance.QuickSwitch1ID;
- QuickSwitch2SceneListID = instance.QuickSwitch2ID;
- }
- }
- void SaveData()
- {
- if(instance) {
- EditorUtility.SetDirty(instance);
- instance.QuickSwitch1ID = QuickSwitch1SceneListID;
- instance.QuickSwitch2ID = QuickSwitch2SceneListID;
- AssetDatabase.SaveAssets();
- AssetDatabase.Refresh();
- }
- }
- private void OnGUI()
- {
- if(GUILayout.Button("Research Scenes")) {
- SearchForScenes();
- }
- GUILayout.Space(10f);
- GUILayout.BeginHorizontal();
- GUILayout.Label("Quick switch 1");
- QuickSwitch1SceneListID = EditorGUILayout.Popup(QuickSwitch1SceneListID, OnlySceneNames.ToArray());
- if(GUILayout.Button("Switch", GUILayout.MaxHeight(14f), GUILayout.MaxWidth(100f)))
- OpenScene(QuickSwitch1SceneListID);
- GUILayout.EndHorizontal();
- GUILayout.Space(2f);
- GUILayout.BeginHorizontal();
- GUILayout.Label("Quick switch 2");
- QuickSwitch2SceneListID = EditorGUILayout.Popup(QuickSwitch2SceneListID, OnlySceneNames.ToArray());
- if(GUILayout.Button("Switch", GUILayout.MaxHeight(14f), GUILayout.MaxWidth(100f)))
- OpenScene(QuickSwitch2SceneListID);
- GUILayout.EndHorizontal();
- GUILayout.Space(10f);
- if(!dropDownSceneList) {
- if(GUILayout.Button("Show Scenes"))
- dropDownSceneList = true;
- }
- else {
- if(GUILayout.Button("Hide Scenes"))
- dropDownSceneList = false;
- _scrollPosition = GUILayout.BeginScrollView(_scrollPosition, GUILayout.Height(position.height / 1.8f));
- string lastDir = "";
- for(int i = 0; i < Scenes.Count; i++) {
- var scene = Scenes[i];
- if(lastDir != scene.FolderName) {
- lastDir = scene.FolderName;
- GUILayout.Space(10);
- GUILayout.Label(lastDir);
- }
- if(GUILayout.Button(scene.SceneName))
- OpenScene(i);
- }
- GUILayout.EndScrollView();
- }
- }
- void OpenScene(int id)
- {
- if(EditorApplication.SaveCurrentSceneIfUserWantsTo())
- EditorApplication.OpenScene(Scenes[id].ScenePath);
- }
- void SearchForScenes()
- {
- OnlySceneNames.Clear();
- Scenes.Clear();
- ProcessDirectory(RootFolder);
- }
- void ProcessDirectory(string targetDirectory)
- {
- // Process the list of files found in the directory.
- string[] fileEntries = Directory.GetFiles(targetDirectory);
- foreach(string fileName in fileEntries)
- ProcessFile(fileName, targetDirectory);
- // Recurse into subdirectories of this directory.
- string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
- foreach(string subdirectory in subdirectoryEntries)
- ProcessDirectory(subdirectory);
- }
- // Insert logic for processing found files here.
- void ProcessFile(string fileName, string folderName)
- {
- if(!fileName.Contains(".unity") || fileName.Contains(".meta")) return;
- var name = fileName.Substring(fileName.LastIndexOf('\\') + 1);
- name = name.Substring(0, name.Length - 6);
- var sceneInfo = new SceneInfo {
- SceneName = name,
- ScenePath = fileName,
- FolderName = folderName
- };
- Scenes.Add(sceneInfo);
- OnlySceneNames.Add(sceneInfo.SceneName);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement