animator它的API部分写的比较杂,导致我们要找想要的功能的时候,经常需要调用四五层接口,我写了一个扩展类,可能帮助我们快速找到想要的功能
1.获取当前animator对应层级的状态机
public static AnimatorStateMachine GetAnimatorStateMachine(this Animator ani,int layer)
{
AnimatorController aniController = ani.runtimeAnimatorController as AnimatorController;
return aniController.layers[layer].stateMachine;
}
2.获取当前层级所有状态
public static AnimatorState[] GetAnimatorState(this Animator ani, int layer)
{
var machine = ani.GetAnimatorStateMachine(layer);
return machine.GetAnimatorState();
}
3.获取子状态机始数组
public static AnimatorStateMachine[] GetSubStateMachines(this Animator ani, int baseLayer)
{
var baseMachine = ani.GetAnimatorStateMachine(baseLayer);
return baseMachine.stateMachines.Select(u=>u.stateMachine).ToArray();
}
4.获取当前状态机所有状态
public static AnimatorStateMachine[] GetSubStateMachines(this Animator ani, int baseLayer)
public static AnimatorState[] GetAnimatorState(this AnimatorStateMachine machine)
{
return machine.states.Select(u => u.state).ToArray();
}
5.通过子状态机名称获取子状态机
public static AnimatorStateMachine GetSubStateMachine(this Animator ani, int baseLayer, string stateMachineName)
{
var machines = ani.GetSubStateMachines(baseLayer);
AnimatorStateMachine machine = machines.FirstOrDefault(u => u.name == stateMachineName);
if (machine == null)
{
Debug.LogError("未找到名称为"+ stateMachineName+"的子状态机");
}
return machine;
}
6.移除当前层所有的过渡状态
public static void RemoveAllTrasition(this Animator ani, int layer)
{
var states = ani.GetAnimatorState(layer);
foreach (AnimatorState state in states)
{
state.RemoveStateAllTrasition();
}
}
6.移除指定状态的所有过渡状态
public static void RemoveStateAllTrasition(this AnimatorState state)
{
foreach (AnimatorStateTransition transition in state.transitions)
{
state.RemoveTransition(transition);
}
}
7.通过目标状态的名称哈希值获取过渡状态
public static AnimatorStateTransition GetTransition(this AnimatorState state,int targetNameHash)
{
var transition = state.transitions.FirstOrDefault(u => u.destinationState.nameHash == targetNameHash);
if (transition == null)
{
Debug.LogError("无法找到NameHash为" + targetNameHash + "的状态");
}
return transition;
}
以上都是要获取比较繁琐的一些状态及属性,通过拓展方法的方式二次封装,能够极大的简化调用的复杂度
拓展脚本收录在我的工具集中,
工具集地址:BlueToolkit
我会在我的公众号上推送新的博文,也可以帮大家解答问题
微信公众号 Andy and Unity 搜索名称或扫描二维码
希望我们能共同成长,共同进步