Unity Animator常用API解析

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 搜索名称或扫描二维码
在这里插入图片描述
希望我们能共同成长,共同进步

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值