From c5b8561b73d88459f628ff8aae4efba0527fe5f5 Mon Sep 17 00:00:00 2001 From: Michal Pikulski Date: Thu, 11 Sep 2025 15:29:28 +0200 Subject: [PATCH] Quick scene browser tab --- Assets/Editor/SceneBrowserWindow.cs | 123 ++++++++++++++++++ Assets/Editor/SceneBrowserWindow.cs.meta | 3 + Assets/Scripts/Movement/FollowerController.cs | 3 - 3 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 Assets/Editor/SceneBrowserWindow.cs create mode 100644 Assets/Editor/SceneBrowserWindow.cs.meta diff --git a/Assets/Editor/SceneBrowserWindow.cs b/Assets/Editor/SceneBrowserWindow.cs new file mode 100644 index 00000000..30166bba --- /dev/null +++ b/Assets/Editor/SceneBrowserWindow.cs @@ -0,0 +1,123 @@ +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +public class SceneBrowserWindow : EditorWindow +{ + private class SceneInfo + { + public string path; + public string name; + public string folder; + public bool inBuildSettings; + } + + private Vector2 _scroll; + private List _scenes = new List(); + private Dictionary> _scenesByFolder = new Dictionary>(); + + [MenuItem("Tools/Scene Browser")] + public static void ShowWindow() + { + var window = GetWindow(false, "Scene Browser", true); + window.RefreshScenes(); + } + + private void OnFocus() + { + RefreshScenes(); + } + + private void RefreshScenes() + { + _scenes.Clear(); + _scenesByFolder.Clear(); + string[] guids = AssetDatabase.FindAssets("t:Scene", new[] { "Assets/Scenes" }); + var buildScenes = EditorBuildSettings.scenes.Select(s => s.path).ToHashSet(); + foreach (var guid in guids) + { + string path = AssetDatabase.GUIDToAssetPath(guid); + string name = Path.GetFileNameWithoutExtension(path); + string folder = Path.GetDirectoryName(path).Replace("\\", "/"); + if (folder == "Assets/Scenes") folder = ""; + var info = new SceneInfo + { + path = path, + name = name, + folder = folder, + inBuildSettings = buildScenes.Contains(path) + }; + _scenes.Add(info); + if (!_scenesByFolder.ContainsKey(folder)) + _scenesByFolder[folder] = new List(); + _scenesByFolder[folder].Add(info); + } + } + + private void OnGUI() + { + if (GUILayout.Button("Refresh")) + RefreshScenes(); + _scroll = EditorGUILayout.BeginScrollView(_scroll); + // Top-level scenes + if (_scenesByFolder.ContainsKey("")) + { + foreach (var scene in _scenesByFolder[""]) + DrawSceneRow(scene); + EditorGUILayout.Space(); + } + // Subfolders + foreach (var kvp in _scenesByFolder) + { + if (string.IsNullOrEmpty(kvp.Key)) continue; + EditorGUILayout.LabelField(kvp.Key, EditorStyles.boldLabel); + foreach (var scene in kvp.Value) + DrawSceneRow(scene); + EditorGUILayout.Space(); + } + EditorGUILayout.EndScrollView(); + } + + private void DrawSceneRow(SceneInfo scene) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(scene.name, GUILayout.Width(180)); + if (GUILayout.Button("Open", GUILayout.Width(50))) + { + if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) + EditorSceneManager.OpenScene(scene.path); + } + if (GUILayout.Button("Locate", GUILayout.Width(50))) + { + var obj = AssetDatabase.LoadAssetAtPath(scene.path); + EditorGUIUtility.PingObject(obj); + } + bool inBuild = scene.inBuildSettings; + bool newInBuild = GUILayout.Toggle(inBuild, "In Build", GUILayout.Width(70)); + if (newInBuild != inBuild) + { + ToggleSceneInBuildSettings(scene.path, newInBuild); + scene.inBuildSettings = newInBuild; + } + EditorGUILayout.EndHorizontal(); + } + + private void ToggleSceneInBuildSettings(string path, bool add) + { + var scenes = EditorBuildSettings.scenes.ToList(); + if (add) + { + if (!scenes.Any(s => s.path == path)) + scenes.Add(new EditorBuildSettingsScene(path, true)); + } + else + { + scenes = scenes.Where(s => s.path != path).ToList(); + } + EditorBuildSettings.scenes = scenes.ToArray(); + } +} + diff --git a/Assets/Editor/SceneBrowserWindow.cs.meta b/Assets/Editor/SceneBrowserWindow.cs.meta new file mode 100644 index 00000000..44fc9a4a --- /dev/null +++ b/Assets/Editor/SceneBrowserWindow.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bda5b0c96582450e94a8b332f86c726d +timeCreated: 1757596929 \ No newline at end of file diff --git a/Assets/Scripts/Movement/FollowerController.cs b/Assets/Scripts/Movement/FollowerController.cs index ef3fe55b..36cf6419 100644 --- a/Assets/Scripts/Movement/FollowerController.cs +++ b/Assets/Scripts/Movement/FollowerController.cs @@ -58,10 +58,7 @@ public class FollowerController: MonoBehaviour /// public event FollowerPickupHandler OnPickupReturned; private Coroutine _pickupCoroutine; - private bool _lastInteractionSuccess = true; - - void Awake() { _aiPath = GetComponent();