Use a Unity function to clear sub-state machines:

- The previous method may not have been safe for clearing assets.
This commit is contained in:
Haï~
2022-05-10 20:06:47 +02:00
parent 46c7bf9000
commit 7bf965824d
+12 -6
View File
@@ -610,12 +610,8 @@ namespace AnimatorAsCode.V0
var originalIndexToPreserveOrdering = FindIndexOf(layerName); var originalIndexToPreserveOrdering = FindIndexOf(layerName);
if (originalIndexToPreserveOrdering != -1) if (originalIndexToPreserveOrdering != -1)
{ {
foreach (var childAnimatorStateMachine in _animatorController.layers[originalIndexToPreserveOrdering].stateMachine.stateMachines) RecursivelyClearChildrenMachines(_animatorController.layers[originalIndexToPreserveOrdering].stateMachine);
{
childAnimatorStateMachine.stateMachine.states = new ChildAnimatorState[0];
childAnimatorStateMachine.stateMachine.entryTransitions = new AnimatorTransition[0];
childAnimatorStateMachine.stateMachine.anyStateTransitions = new AnimatorStateTransition[0];
}
_animatorController.layers[originalIndexToPreserveOrdering].stateMachine.stateMachines = new ChildAnimatorStateMachine[0]; _animatorController.layers[originalIndexToPreserveOrdering].stateMachine.stateMachines = new ChildAnimatorStateMachine[0];
_animatorController.layers[originalIndexToPreserveOrdering].stateMachine.states = new ChildAnimatorState[0]; _animatorController.layers[originalIndexToPreserveOrdering].stateMachine.states = new ChildAnimatorState[0];
_animatorController.layers[originalIndexToPreserveOrdering].stateMachine.entryTransitions = new AnimatorTransition[0]; _animatorController.layers[originalIndexToPreserveOrdering].stateMachine.entryTransitions = new AnimatorTransition[0];
@@ -638,6 +634,16 @@ namespace AnimatorAsCode.V0
return machinist; return machinist;
} }
private void RecursivelyClearChildrenMachines(AnimatorStateMachine parentMachine)
{
// TODO: RemoveStateMachine might already be recursive
foreach (var childStateMachineHolder in parentMachine.stateMachines)
{
RecursivelyClearChildrenMachines(childStateMachineHolder.stateMachine);
parentMachine.RemoveStateMachine(childStateMachineHolder.stateMachine);
}
}
private int FindIndexOf(string layerName) private int FindIndexOf(string layerName)
{ {
return _animatorController.layers.ToList().FindIndex(layer1 => layer1.name == layerName); return _animatorController.layers.ToList().FindIndex(layer1 => layer1.name == layerName);