using System; using UnityEngine; using UnityEngine.SceneManagement; namespace jeanf.scenemanagement { /// /// Hooks into existing scene loading systems to track events for debugging. /// This component is automatically created and doesn't modify core loading logic. /// [DefaultExecutionOrder(-1000)] public class SceneLoadingDebugHooks : MonoBehaviour { private static SceneLoadingDebugHooks _instance; [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void Initialize() { if (_instance != null) return; var go = new GameObject("[SceneLoadingDebugHooks]"); _instance = go.AddComponent(); DontDestroyOnLoad(go); } private void Awake() { if (_instance != null && _instance != this) { Destroy(gameObject); return; } _instance = this; DontDestroyOnLoad(gameObject); } private void OnEnable() { // Subscribe to Unity's scene management callbacks SceneManager.sceneLoaded += OnSceneLoaded; SceneManager.sceneUnloaded += OnSceneUnloaded; // Subscribe to custom loading events LoadingInformation.LoadingStatus += OnLoadingStatusChanged; LoadPersistentSubScenes.PersistentLoadingComplete += OnPersistentLoadingComplete; SceneLoader.IsLoading += OnSceneLoaderStatusChanged; } private void OnDisable() { SceneManager.sceneLoaded -= OnSceneLoaded; SceneManager.sceneUnloaded -= OnSceneUnloaded; LoadingInformation.LoadingStatus -= OnLoadingStatusChanged; LoadPersistentSubScenes.PersistentLoadingComplete -= OnPersistentLoadingComplete; SceneLoader.IsLoading -= OnSceneLoaderStatusChanged; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (scene.name == gameObject.scene.name) return; var tracker = SceneLoadingTracker.Instance; if (tracker != null) { tracker.TrackSceneLoadComplete(scene.name); } } private void OnSceneUnloaded(Scene scene) { var tracker = SceneLoadingTracker.Instance; if (tracker != null) { tracker.TrackSceneUnloadComplete(scene.name); } } private void OnLoadingStatusChanged(string status) { if (string.IsNullOrEmpty(status)) return; var tracker = SceneLoadingTracker.Instance; if (tracker == null) return; // Parse loading status messages if (status.StartsWith("Loading: ")) { var sceneName = status.Substring(9); tracker.TrackSceneLoadStart(sceneName, SceneLoadingTracker.SceneType.AdditiveScene); } else if (status.StartsWith("Loading subScene: ")) { var sceneName = status.Substring(18).TrimEnd('.'); tracker.TrackSubsceneLoadStart(sceneName); } else if (status.Contains("loaded successfully")) { var parts = status.Split(' '); if (parts.Length > 1) { var sceneName = parts[1]; tracker.TrackSceneLoadComplete(sceneName); } } } private void OnPersistentLoadingComplete(bool status) { var tracker = SceneLoadingTracker.Instance; if (tracker != null && status) { Debug.Log("[SceneLoadingDebugHooks] All persistent subscenes loaded"); } } private void OnSceneLoaderStatusChanged(bool isLoading) { // Track when the scene loader changes state if (!isLoading) { Debug.Log($"[SceneLoadingDebugHooks] SceneLoader finished at {Time.realtimeSinceStartup:F2}s"); } } } }