From 374b2cddc4997aa817e8732edc32a333b8f8bd2a Mon Sep 17 00:00:00 2001 From: bd_ Date: Tue, 20 Dec 2022 21:32:28 +0900 Subject: [PATCH] fix: multiple bugs in Activator * Activator tries to mark scene dirty in play mode (fixes #164) * Activator creates multiple hidden objects which build up over time --- .../Runtime/Activator.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Packages/nadena.dev.modular-avatar/Runtime/Activator.cs b/Packages/nadena.dev.modular-avatar/Runtime/Activator.cs index 369be35b..6d16c92c 100644 --- a/Packages/nadena.dev.modular-avatar/Runtime/Activator.cs +++ b/Packages/nadena.dev.modular-avatar/Runtime/Activator.cs @@ -56,11 +56,13 @@ namespace nadena.dev.modular_avatar.core private void OnValidate() { + if (EditorApplication.isPlayingOrWillChangePlaymode) return; + EditorApplication.delayCall += () => { if (this == null) return; - gameObject.hideFlags = HideFlags.HideInHierarchy; + gameObject.hideFlags = HIDE_FLAGS; if (!HasMAComponentsInScene()) { var scene = gameObject.scene; @@ -75,24 +77,34 @@ namespace nadena.dev.modular_avatar.core if (!scene.IsValid() || EditorSceneManager.IsPreviewScene(scene)) return; if (EditorApplication.isPlayingOrWillChangePlaymode) return; + bool rootPresent = false; foreach (var root in scene.GetRootGameObjects()) { - if (root.GetComponent() != null) return; + if (root.GetComponent() != null) + { + root.hideFlags = HIDE_FLAGS; + if (rootPresent) DestroyImmediate(root); + rootPresent = true; + } } + if (rootPresent) return; + var oldActiveScene = SceneManager.GetActiveScene(); try { SceneManager.SetActiveScene(scene); var gameObject = new GameObject(TAG_OBJECT_NAME); gameObject.AddComponent(); - gameObject.hideFlags = HideFlags.HideInHierarchy; + gameObject.hideFlags = HIDE_FLAGS; } finally { SceneManager.SetActiveScene(oldActiveScene); } } + + private const HideFlags HIDE_FLAGS = HideFlags.HideInHierarchy; } [AddComponentMenu("")]