diff --git a/Editor/Animation/GameObjectDisableDelayPass.cs b/Editor/Animation/GameObjectDisableDelayPass.cs index 8e8bca4c..6e28d67f 100644 --- a/Editor/Animation/GameObjectDisableDelayPass.cs +++ b/Editor/Animation/GameObjectDisableDelayPass.cs @@ -52,6 +52,21 @@ namespace nadena.dev.modular_avatar.animation defaultWeight = 1, blendingMode = AnimatorLayerBlendingMode.Override }).ToArray(); + + // Ensure the initial state of readable props matches the actual state of the gameobject + var parameters = fx.parameters; + var paramToIndex = parameters.Select((p, i) => (p, i)).ToDictionary(x => x.p.name, x => x.i); + foreach (var (binding, prop) in asc.BoundReadableProperties) + { + var obj = asc.PathMappings.PathToObject(binding.path); + + if (obj != null && paramToIndex.TryGetValue(prop, out var index)) + { + parameters[index].defaultFloat = obj.activeSelf ? 1 : 0; + } + } + + fx.parameters = parameters; } private ChildMotion GenerateDelayChild((EditorCurveBinding, string) binding) diff --git a/UnitTests~/ReactiveComponent/ObjectToggleTests.cs b/UnitTests~/ReactiveComponent/ObjectToggleTests.cs new file mode 100644 index 00000000..6637ff05 --- /dev/null +++ b/UnitTests~/ReactiveComponent/ObjectToggleTests.cs @@ -0,0 +1,50 @@ +using System.Linq; +using modular_avatar_tests; +using nadena.dev.modular_avatar.core; +using nadena.dev.modular_avatar.core.editor; +using NUnit.Framework; +using UnityEditor.Animations; +using UnityEngine; + +namespace UnitTests.ReactiveComponent +{ + internal class ObjectToggleTests : TestBase + { + [Test] + public void WhenObjectIsAlwaysOn_CorrectProxyParameterIsGenerated() + { + var root = CreateRoot("root"); + var obj = CreateChild(root, "obj"); + var toggle = CreateChild(root, "toggle"); + + // Prevent obj from being removed by the GC game objects pass + obj.AddComponent(); + + var toggleComponent = toggle.AddComponent(); + var aor = new AvatarObjectReference(); + aor.Set(obj); + + toggleComponent.Objects = new() + { + new() + { + Active = false, + Object = aor + } + }; + + AvatarProcessor.ProcessAvatar(root); + + // TODO: Ideally we should start using play mode testing for these things... + var fx = (AnimatorController)FindFxController(root).animatorController; + var readableProp = fx.parameters.FirstOrDefault( + p => p.name.StartsWith("__MA/ReadableProp/obj/UnityEngine.GameObject/m_IsActive") + ); + + Assert.IsNotNull(readableProp); + Assert.AreEqual(readableProp.defaultFloat, 0); + + Assert.IsFalse(obj.activeSelf); + } + } +} \ No newline at end of file diff --git a/UnitTests~/ReactiveComponent/ObjectToggleTests.cs.meta b/UnitTests~/ReactiveComponent/ObjectToggleTests.cs.meta new file mode 100644 index 00000000..9e86034a --- /dev/null +++ b/UnitTests~/ReactiveComponent/ObjectToggleTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7c68d69f7b4a46c5b2ce3d8f26b0fa76 +timeCreated: 1729376563 \ No newline at end of file