fix: always-on toggles fail to animate objects to off (#1300)

Closes: #1285
This commit is contained in:
bd_ 2024-10-19 17:15:23 -07:00 committed by GitHub
parent ae975506d7
commit 9dc342e81e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 68 additions and 0 deletions

View File

@ -59,6 +59,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(Motion nullMotion, (EditorCurveBinding, string) binding)

View File

@ -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<MeshRenderer>();
var toggleComponent = toggle.AddComponent<ModularAvatarObjectToggle>();
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);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7c68d69f7b4a46c5b2ce3d8f26b0fa76
timeCreated: 1729376563