From 17051419ecc3ed2ea602ee41bce8d585e715943c Mon Sep 17 00:00:00 2001 From: bd_ Date: Wed, 9 Apr 2025 19:14:44 -0700 Subject: [PATCH] change: force blend tree-only layers to WD ON (#1551) Closes: #1545 --- CHANGELOG-PRERELEASE-jp.md | 2 + CHANGELOG-PRERELEASE.md | 2 + CHANGELOG-jp.md | 2 + CHANGELOG.md | 3 + Editor/MergeAnimatorProcessor.cs | 11 +++- .../WriteDefaults/TestSet_false.controller | 64 +++++++++++++++++- .../WriteDefaults/TestSet_true.controller | 66 ++++++++++++++++++- .../WriteDefaults/WriteDefaultsMergeTests.cs | 1 + 8 files changed, 145 insertions(+), 6 deletions(-) diff --git a/CHANGELOG-PRERELEASE-jp.md b/CHANGELOG-PRERELEASE-jp.md index 58bceaf8..2a95122e 100644 --- a/CHANGELOG-PRERELEASE-jp.md +++ b/CHANGELOG-PRERELEASE-jp.md @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Changed +- [#1551] Merge Animatorは、遷移のない単一のstateを持つブレンドツリーのレイヤーに対して常にWDをONに設定します。 + - 一部、以前の挙動に依存したアセットとの互換性を向上させるための変更です。 ### Removed diff --git a/CHANGELOG-PRERELEASE.md b/CHANGELOG-PRERELEASE.md index 34a3a099..6481b139 100644 --- a/CHANGELOG-PRERELEASE.md +++ b/CHANGELOG-PRERELEASE.md @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Changed +- [#1551] Merge Animator will always set WD ON for single-state blendtree layers with no any state transitions. + - This fixes compatibility issues with assets which relied on the prior behavior. ### Removed diff --git a/CHANGELOG-jp.md b/CHANGELOG-jp.md index 545765f6..c6345d0e 100644 --- a/CHANGELOG-jp.md +++ b/CHANGELOG-jp.md @@ -14,6 +14,8 @@ Modular Avatarの主な変更点をこのファイルで記録しています。 ### Fixed ### Changed +- [#1551] Merge Animatorは、遷移のない単一のstateを持つブレンドツリーのレイヤーに対して常にWDをONに設定します。 + - 一部、以前の挙動に依存したアセットとの互換性を向上させるための変更です。 ### Removed diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e141332..f230d01c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Changed +- [#1551] Merge Animator will always set WD ON for single-state blendtree layers with no any state transitions. + - This fixes compatibility issues with assets which relied on the prior behavior. ### Removed @@ -32,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1542] Merge Animator now will match WD settings for layers with a single state containing an animation clip, but not if it contains a blend tree. This fixes some compatibility issues introduced in 1.12 (where the behavior was changed to not match WD settings for single-state animation clips). +- [#1551] Merge Animator will always set WD ON for single-state blendtree layers with no any state transitions. ## [1.12.2] - [2025-04-03] diff --git a/Editor/MergeAnimatorProcessor.cs b/Editor/MergeAnimatorProcessor.cs index 815341da..c1fc5a10 100644 --- a/Editor/MergeAnimatorProcessor.cs +++ b/Editor/MergeAnimatorProcessor.cs @@ -141,7 +141,7 @@ namespace nadena.dev.modular_avatar.core.editor { initialWriteDefaults = null; } - + var vac = context.PluginBuildContext.Extension(); if (!vac.Controllers.TryGetValue(merge, out var clonedController)) return; @@ -160,6 +160,15 @@ namespace nadena.dev.modular_avatar.core.editor } } + if (l.StateMachine?.DefaultState?.Motion is VirtualBlendTree + && l.StateMachine.States.Count == 1 + && l.StateMachine.StateMachines.Count == 0 + && l.StateMachine.AnyStateTransitions.Count == 0) + { + // Force WD on for single state blendtree layers + l.StateMachine.DefaultState.WriteDefaultValues = true; + } + targetController.AddLayer(new LayerPriority(merge.layerPriority), l); } diff --git a/UnitTests~/MergeAnimatorTests/WriteDefaults/TestSet_false.controller b/UnitTests~/MergeAnimatorTests/WriteDefaults/TestSet_false.controller index f740f10f..9e682bc0 100644 --- a/UnitTests~/MergeAnimatorTests/WriteDefaults/TestSet_false.controller +++ b/UnitTests~/MergeAnimatorTests/WriteDefaults/TestSet_false.controller @@ -322,7 +322,7 @@ AnimatorStateMachine: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: X_BlendTree + m_Name: 1_BlendTree_InitialOff m_ChildStates: - serializedVersion: 1 m_State: {fileID: 5140747817625705091} @@ -359,6 +359,32 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1102 &-398412080201691195 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: blendtree + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 20600000, guid: f2beba729514fc94eb1a78f8340a8738, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!91 &9100000 AnimatorController: m_ObjectHideFlags: 0 @@ -412,7 +438,7 @@ AnimatorController: m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} - serializedVersion: 5 - m_Name: X_BlendTree + m_Name: 1_BlendTree_InitialOff m_StateMachine: {fileID: -540454885725092262} m_Mask: {fileID: 0} m_Motions: [] @@ -423,6 +449,18 @@ AnimatorController: m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: 1_BlendTree_InitialOn + m_StateMachine: {fileID: 8678878570627476277} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} - serializedVersion: 5 m_Name: M_BlendTree_with_transitions m_StateMachine: {fileID: -8503209154062428420} @@ -743,6 +781,28 @@ AnimatorStateMachine: m_ExitPosition: {x: 800, y: 120, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: 2924615304351484976} +--- !u!1107 &8678878570627476277 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 1_BlendTree_InitialOn + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -398412080201691195} + m_Position: {x: 410, y: 80, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -398412080201691195} --- !u!1101 &9087045955160975718 AnimatorStateTransition: m_ObjectHideFlags: 1 diff --git a/UnitTests~/MergeAnimatorTests/WriteDefaults/TestSet_true.controller b/UnitTests~/MergeAnimatorTests/WriteDefaults/TestSet_true.controller index ec48ffb1..c1a30920 100644 --- a/UnitTests~/MergeAnimatorTests/WriteDefaults/TestSet_true.controller +++ b/UnitTests~/MergeAnimatorTests/WriteDefaults/TestSet_true.controller @@ -164,7 +164,7 @@ AnimatorState: m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 - m_WriteDefaultValues: 1 + m_WriteDefaultValues: 0 m_Mirror: 0 m_SpeedParameterActive: 0 m_MirrorParameterActive: 0 @@ -343,7 +343,7 @@ AnimatorController: m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} - serializedVersion: 5 - m_Name: X_BlendTree + m_Name: 1_BlendTree_InitialOff m_StateMachine: {fileID: 8798472560561482739} m_Mask: {fileID: 0} m_Motions: [] @@ -354,6 +354,18 @@ AnimatorController: m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: 1_BlendTree_InitialOn + m_StateMachine: {fileID: 723720481014261193} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} - serializedVersion: 5 m_Name: M_BlendTree_with_transitions m_StateMachine: {fileID: 6073696076277274403} @@ -402,6 +414,28 @@ AnimatorController: m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} +--- !u!1107 &723720481014261193 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 1_BlendTree_InitialOn + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 4331185042199677927} + m_Position: {x: 618.3097, y: -44.39499, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 4331185042199677927} --- !u!206 &1172723464858944439 BlendTree: m_ObjectHideFlags: 1 @@ -491,6 +525,32 @@ AnimatorStateMachine: m_ExitPosition: {x: 800, y: 120, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: -3889880041459077057} +--- !u!1102 &4331185042199677927 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: blendtree + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 20600000, guid: f2beba729514fc94eb1a78f8340a8738, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1102 &5369915444104545634 AnimatorState: serializedVersion: 6 @@ -689,7 +749,7 @@ AnimatorStateMachine: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: X_BlendTree + m_Name: 1_BlendTree_InitialOff m_ChildStates: - serializedVersion: 1 m_State: {fileID: -4604261159886404567} diff --git a/UnitTests~/MergeAnimatorTests/WriteDefaults/WriteDefaultsMergeTests.cs b/UnitTests~/MergeAnimatorTests/WriteDefaults/WriteDefaultsMergeTests.cs index e67035fd..31e8b545 100644 --- a/UnitTests~/MergeAnimatorTests/WriteDefaults/WriteDefaultsMergeTests.cs +++ b/UnitTests~/MergeAnimatorTests/WriteDefaults/WriteDefaultsMergeTests.cs @@ -63,6 +63,7 @@ namespace UnitTests.MergeAnimatorTests.WriteDefaults break; } case 'X': expectedState = mergeAnimatorInitialState; break; + case '1': expectedState = true; break; default: continue; }