using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine.SceneManagement; using Xprees.SceneManagement.ScriptableObjects; namespace Xprees.SceneManagement.Editor { public class EditorSceneTracker { private string[] scenePaths; private List> scenesTracked; public IEnumerable Scenes => scenesTracked?.Select(tuple => tuple.Item1); public EditorSceneTracker() { InitScenesList(); } public bool? IsSceneOpen(SceneSO scene) => IsSceneOpen(scene.GetScenePath()); private bool IsSceneOpen(string scenePath) { if (scenePath == null) return false; for (var i = 0; i < SceneManager.sceneCount; i++) { var currentScene = SceneManager.GetSceneAt(i); if (currentScene.path == scenePath) return true; } return false; } private void InitScenesList() { scenePaths = GetAllScenePaths().ToArray(); var scenes = scenePaths.Select(AssetDatabase.LoadAssetAtPath); scenesTracked = scenes .Select(scene => new Tuple(scene, IsSceneOpen(scene))) .Where(tuple => tuple.Item2 != null) .Select(tuple => new Tuple(tuple.Item1, tuple.Item2!.Value)) .ToList(); } private static IEnumerable GetAllScenePaths() => AssetDatabase.FindAssets($"t:{nameof(SceneSO)}") .Select(AssetDatabase.GUIDToAssetPath); } }