From dcda15569a242509ba40d38071145616508e8ed6 Mon Sep 17 00:00:00 2001 From: bd_ Date: Wed, 9 Apr 2025 20:05:48 -0700 Subject: [PATCH] fix: merge blend tree does not correct parameter type conflicts (#1552) --- CHANGELOG-PRERELEASE-jp.md | 2 + CHANGELOG-PRERELEASE.md | 2 + CHANGELOG-jp.md | 2 + CHANGELOG.md | 2 + Editor/MergeBlendTreePass.cs | 31 ++++++++++++---- UnitTests~/Animation/MergeBlendTreeTest.cs | 43 ++++++++++++++++++++++ 6 files changed, 75 insertions(+), 7 deletions(-) diff --git a/CHANGELOG-PRERELEASE-jp.md b/CHANGELOG-PRERELEASE-jp.md index c9ba0706..a247d853 100644 --- a/CHANGELOG-PRERELEASE-jp.md +++ b/CHANGELOG-PRERELEASE-jp.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Fixed +- [#1552] Merge Blend Treeにて、メインアバターFXレイヤーと同じ名前のintやboolパラメーターがBlend Treeに含まれている場合、 + パラメーター型が修正されない問題を修正 - [#1553] リアクティブコンポーネントが生成するステートに、WD設定が正しくない問題を修正 ### Changed diff --git a/CHANGELOG-PRERELEASE.md b/CHANGELOG-PRERELEASE.md index 57619e6f..2a17c150 100644 --- a/CHANGELOG-PRERELEASE.md +++ b/CHANGELOG-PRERELEASE.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Fixed +- [#1552] Merge Blend Tree failed to correct parameter types when the main avatar FX layer contained an int or bool + parameter with the same name as one used in the blend tree. - [#1553] Reactive components might generate states with incorrect write default settings ### Changed diff --git a/CHANGELOG-jp.md b/CHANGELOG-jp.md index a52ee500..edde11f6 100644 --- a/CHANGELOG-jp.md +++ b/CHANGELOG-jp.md @@ -12,6 +12,8 @@ Modular Avatarの主な変更点をこのファイルで記録しています。 - (実験的機能) VRC以外のプラットフォームのサポートを有効化 ### Fixed +- [#1552] Merge Blend Treeにて、メインアバターFXレイヤーと同じ名前のintやboolパラメーターがBlend Treeに含まれている場合、 +パラメーター型が修正されない問題を修正 - [#1553] リアクティブコンポーネントが生成するステートに、WD設定が正しくない問題を修正 ### Changed diff --git a/CHANGELOG.md b/CHANGELOG.md index c48b066a..e0b82942 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - (Experimental feature) Enabled support for non-VRC platforms ### Fixed +- [#1552] Merge Blend Tree failed to correct parameter types when the main avatar FX layer contained an int or bool +parameter with the same name as one used in the blend tree. - [#1553] Reactive components might generate states with incorrect write default settings ### Changed diff --git a/Editor/MergeBlendTreePass.cs b/Editor/MergeBlendTreePass.cs index bea45aaa..63454a80 100644 --- a/Editor/MergeBlendTreePass.cs +++ b/Editor/MergeBlendTreePass.cs @@ -65,14 +65,31 @@ namespace nadena.dev.modular_avatar.core.editor foreach (var name in _parameterNames) { - if (fx.Parameters.ContainsKey(name)) continue; - - fx.Parameters = fx.Parameters.SetItem(name, new AnimatorControllerParameter() + if (fx.Parameters.TryGetValue(name, out var existingParameter)) { - name = name, - type = AnimatorControllerParameterType.Float, - defaultFloat = 0.0f - }); + switch (existingParameter.type) + { + case AnimatorControllerParameterType.Bool: + existingParameter.defaultFloat = existingParameter.defaultBool ? 1 : 0; + break; + case AnimatorControllerParameterType.Int: + existingParameter.defaultFloat = existingParameter.defaultInt; + break; + } + + existingParameter.type = AnimatorControllerParameterType.Float; + } + else + { + existingParameter = new AnimatorControllerParameter + { + name = name, + type = AnimatorControllerParameterType.Float, + defaultFloat = 0.0f + }; + } + + fx.Parameters = fx.Parameters.SetItem(name, existingParameter); } } diff --git a/UnitTests~/Animation/MergeBlendTreeTest.cs b/UnitTests~/Animation/MergeBlendTreeTest.cs index 9da51e8a..06837f37 100644 --- a/UnitTests~/Animation/MergeBlendTreeTest.cs +++ b/UnitTests~/Animation/MergeBlendTreeTest.cs @@ -141,6 +141,49 @@ namespace modular_avatar_tests Assert.AreEqual(new[] {MergeBlendTreePass.BlendTreeLayerName, MMDRelayPass.ControlLayerName, MMDRelayPass.DummyLayerName, "m2", "Eyes", "FaceMood", "m1", "m3"}, layerNames); } + + [Test] + public void BoolParameterConvertedToFloat() + { + // Create an animator controller with a bool parameter + var controller = new AnimatorController(); + controller.AddParameter("testBool", AnimatorControllerParameterType.Bool); + + // Create the root object and set the FX layer to the created controller + var root = CreateRoot("root"); + var vrcDesc = root.GetComponent(); + var baseLayers = vrcDesc.baseAnimationLayers; + + for (int i = 0; i < baseLayers.Length; i++) + { + if (baseLayers[i].type == VRCAvatarDescriptor.AnimLayerType.FX) + { + baseLayers[i].animatorController = controller; + baseLayers[i].isDefault = false; + } + } + + vrcDesc.customizeAnimationLayers = true; + + // Add a Merge Blend Tree component using the same parameter + var child = CreateChild(root, "child"); + var mergeComponent = child.AddComponent(); + var blendTree = new BlendTree + { + blendParameter = "testBool", + blendType = BlendTreeType.Simple1D + }; + blendTree.AddChild(AnimationTestUtil.AnimationWithPath("a")); + mergeComponent.BlendTree = blendTree; + + // Process the avatar + AvatarProcessor.ProcessAvatar(root); + + // Verify that the parameter is converted to a float + var fxController = FindController(root, VRCAvatarDescriptor.AnimLayerType.FX).animatorController as AnimatorController; + Assert.IsTrue(fxController!.parameters.Any(p => + p.name == "testBool" && p.type == AnimatorControllerParameterType.Float)); + } ModularAvatarMergeAnimator TestMerge(GameObject root, string mergeName, Motion motion = null) {