简单介绍一下Animator的状态机结构,如图所示:

SubState中 又包含若干可能的最终State,理论上可以层层嵌套
当我们需要利用到Animator的静态资源进行一些配置操作或配置检查时,需要利用到AnimatorController这个类,这个类仅限于Editor环境下使用,需要注意。
而对于各个最终的子状态机,我们可以利用递归的形式拿到对应Animator下的所有数据,使用以下的方法,可以对各个子状态机进行一系列的个性化逻辑处理,当然,仅仅是抛砖引玉。
private static void CheckAllAnimatorStateRefrences()
{
var animator = AssetDatabase.LoadAssetAtPath(AnimatorAssetPath);
//AnimatorAssetPath -> string for animator file path
if (animator != null)
{
var controller = animator.runtimeAnimatorController as AnimatorController;
if(controller != null && controller.layers.Length > 0 && controller.animationClips.Length > 0)
{
foreach (var layer in controller.layers)
{
foreach (var state in layer.stateMachine.states)
{
FinalAction(state);
// That's what you want to do for every ChildAnimatorState
}
var childMachine = layer.stateMachine;
StateMachineDataProcessV2(childMachine);
}
}
else
{
//You could do something for Null or Error process
}
}
else
{
//You could do something for Null or Error process
}
}
/// /// 递归函数,对每一个最终的state进行action处理,更灵活的代码 ///
/// 状态机对应层级的原始节点
private static void StateMachineDataProcessV2(AnimatorStateMachine stateMachine,
Action action = null)
{
foreach (var machine in stateMachine.stateMachines) //这是一个递归的逻辑
{
foreach (var state in machine.stateMachine.states)
{
action?.Invoke(state);
}
if (machine.stateMachine.stateMachines.Length > 0)
{
StateMachineDataProcessV2(machine.stateMachine, action);
}
else
continue;
}
}
上述的递归算法个人认为是涉及Animator子状态机配置时,比较通用的一个递归逻辑。可以一劳永逸的处理一系列相关事务。