diff --git a/CHANGELOG.md b/CHANGELOG.md index eae9fd5e..ae0ee078 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#320] Render nodes are not correctly reused across frames - [#321] Fix GetTargetGroup being called on every pipeline invalidation - [#327] Z-fighting occurs in prefab isolation view +- [#328] Fix issue where preview system is not reinitialized after a scene change ### Changed diff --git a/Editor/ChangeStream/ObjectWatcher.cs b/Editor/ChangeStream/ObjectWatcher.cs index 0dc58f8f..07a67029 100644 --- a/Editor/ChangeStream/ObjectWatcher.cs +++ b/Editor/ChangeStream/ObjectWatcher.cs @@ -9,6 +9,7 @@ using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; +using Debug = System.Diagnostics.Debug; using Object = UnityEngine.Object; #endregion @@ -73,10 +74,56 @@ internal ObjectWatcher() [InitializeOnLoadMethod] private static void Init() { - SceneManager.sceneLoaded += (_, _) => Instance.Hierarchy.InvalidateAll(); - SceneManager.sceneUnloaded += _ => Instance.Hierarchy.InvalidateAll(); - SceneManager.activeSceneChanged += (_, _) => Instance.Hierarchy.InvalidateAll(); - Instance.PropertyMonitor.MaybeStartRefreshTimer(); + EditorApplication.delayCall += () => + { + SceneManager.sceneLoaded += (_, _) => + { + Debug.WriteLine("=== Scene loaded ==="); + Instance.Hierarchy.InvalidateAll(); + }; + SceneManager.sceneUnloaded += _ => + { + Debug.WriteLine("=== Scene unloaded ==="); + Instance.Hierarchy.InvalidateAll(); + }; + SceneManager.activeSceneChanged += (_, _) => + { + Debug.WriteLine("=== Active scene changed ==="); + Instance.Hierarchy.InvalidateAll(); + }; + Instance.PropertyMonitor.MaybeStartRefreshTimer(); + + // These SceneManager callbacks are never invoked, for some reason. Workaround this with a periodic check. + EditorApplication.update += Instance.CheckActiveScenes; + }; + } + + private Scene[] _activeScenes = Array.Empty(); + + private void CheckActiveScenes() + { + if (SceneManager.sceneCount != _activeScenes.Length) + { + InvalidateScenes(); + + return; + } + + for (var i = 0; i < _activeScenes.Length; i++) + if (_activeScenes[i] != SceneManager.GetSceneAt(i)) + { + InvalidateScenes(); + + return; + } + + void InvalidateScenes() + { + _activeScenes = new Scene[SceneManager.sceneCount]; + for (var i = 0; i < _activeScenes.Length; i++) _activeScenes[i] = SceneManager.GetSceneAt(i); + + Hierarchy.InvalidateAll(); + } } public ImmutableList MonitorSceneRoots(ComputeContext ctx) @@ -207,7 +254,7 @@ private static void InvokeCallback(Action callback, object t) where T : cl } catch (Exception e) { - Debug.LogException(e); + UnityEngine.Debug.LogException(e); } } @@ -220,7 +267,7 @@ private static bool InvokeCallback(Func callback, object t) where T } catch (Exception e) { - Debug.LogException(e); + UnityEngine.Debug.LogException(e); return true; } }