AgentCodeMonk Geschrieben 23. August 2015 Melden Share Geschrieben 23. August 2015 (bearbeitet) Hier mal ein kleines Script, dass das ewig-nervige Rumgeklicke durch die Projektordner zu den Szenen ein wenig abkürzen soll. Zumindest mich nervt sowas ziemlich Es lohnt sich vorallem, wenn man Unity schön über 2 Monitore fahren kann und Platz für ein paar extra Fenster hat. Ihr könnt einfach "ScenesFolder" anpassen und dort den Pfad zu euren Szenen angeben. Der Ordner sollte NUR Szenen beinhalten (macht Sinn bei einem Ordner für Szenen ) Unter "Window" findet ihr dann einen Menüpunkt namens "ShowScenes" - hiermit öffnet ihr das Fenster. Natürlich gehört das Script in einen Editor-Ordner. Wie immer ist das ein Snippet und lässt sich locker verbessern, erweitern etc pp. Sieht so aus: Script: using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; public struct SceneInfo { public string SceneName; public string ScenePath; } public class SceneListWindow : EditorWindow { [MenuItem("Window/ShowScenes")] public static void Init() { // Get existing open window or if none, make a new one: SceneListWindow window = (SceneListWindow)GetWindow(typeof(SceneListWindow)); SearchForScenes(); } private Vector2 _scrollPosition; private static readonly string RootFolder = "Assets"; private static readonly List<SceneInfo> Scenes = new List<SceneInfo>(); private void OnGUI() { if (GUILayout.Button("reload")) { SearchForScenes(); } GUILayout.Space(10); _scrollPosition = GUILayout.BeginScrollView(_scrollPosition, GUILayout.Height(position.height - 40)); foreach (var scene in Scenes.Where(scene => GUILayout.Button(scene.SceneName))) { EditorApplication.OpenScene(scene.ScenePath); } GUILayout.EndScrollView(); } public static void SearchForScenes() { Scenes.Clear(); ProcessDirectory(RootFolder); } public static 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); // 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. public static void ProcessFile(string fileName) { 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 }; Scenes.Add(sceneInfo); } } bearbeitet 6. September 2015 von AgentCodeMonkey 4 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
SilentDev Geschrieben 24. August 2015 Melden Share Geschrieben 24. August 2015 Hey danke finde ich Super die Idee Arbeite mit 3 Bildschirmen das erleichtert einiges. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MaZy Geschrieben 24. August 2015 Melden Share Geschrieben 24. August 2015 Ich mache das gerne als Dropdown-Menü . Allerdings sind sie bei mir nicht automatisiert, sondern mann muss selbst die Namen eintragen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
AgentCodeMonk Geschrieben 1. September 2015 Autor Melden Share Geschrieben 1. September 2015 (bearbeitet) *Update Das Script geht jetzt durch alle Directories im Assets Dir bearbeitet 6. September 2015 von AgentCodeMonkey Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MaZy Geschrieben 17. September 2015 Melden Share Geschrieben 17. September 2015 *Update Das Script geht jetzt durch alle Directories im Assets Dir Wieso wird das Menü resetet, wenn man aus dem Play-Mode raus geht? Kann man das verhindern? Zweitens ich hab dein Code für mich angepasst. Edit: jetzt sieht man die Liste auch nach dem man aus dem Playmode raus geht: Update: Ordnerpfade werden nun als Übersicht auch angezeigt, siehe unten (das hatte ich gemeint bevor ich diesen Edit bzw Update hinzugefügt habe). Es wird jetzt beim Szenenwechsel gefragt, ob man erst mal speichern will! Unnötige static Variablen und Methoden wurden umgewandelt Die meisten Methoden sind nicht mehr public (hab da kein Sinn gesehen ^^). OnEnable() hinzugefügt. Jetzt werden die Szenen beim Öffnen geladen bzw. auch wenn man vom Playmode rausgehtBesser als Init(), da Init() nur aufgerufen wird, wenn man auf das Menüitem klickt anstatt, dass es Allgemein neu getriggert wird. Ich denke muss hier nichts erklären ^^. 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 { private Vector2 _scrollPosition; private static readonly string RootFolder = "Assets"; private readonly List<SceneInfo> Scenes = new List<SceneInfo>(); [MenuItem("Window/ShowScenes")] public static void Init() { // Open this window GetWindow(typeof(ScenelistWindow)); } void OnEnable() { SearchForScenes(); } private void OnGUI() { if (GUILayout.Button("Reload")) { SearchForScenes(); } GUILayout.Space(10); _scrollPosition = GUILayout.BeginScrollView(_scrollPosition, GUILayout.Height(position.height - 40)); string lastDir = ""; foreach (var scene in Scenes) { if(lastDir != scene.FolderName) { lastDir = scene.FolderName; GUILayout.Space(10); GUILayout.Label(lastDir); } if (GUILayout.Button(scene.SceneName)) if(EditorApplication.SaveCurrentSceneIfUserWantsTo()) EditorApplication.OpenScene(scene.ScenePath); } GUILayout.EndScrollView(); } void SearchForScenes() { 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); } } 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.