Jump to content
Unity Insider Forum
Sign in to follow this  
AgentCodeMonkey

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


Edited by AgentCodeMonkey
  • Like 4

Share this post


Link to post
Share on other sites

Ich mache das gerne als Dropdown-Menü :). Allerdings sind sie bei mir nicht automatisiert, sondern mann muss selbst die Namen eintragen.

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×