Jump to content
Unity Insider Forum

ScenesListWindow


Recommended Posts

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:

 

scenelistwindow.png

 

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 von AgentCodeMonkey
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...
  • 3 weeks later...

*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 rausgeht
    • Besser 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 ^^.

R5j89Ru.png

 

 


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);
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...