子状态机 & 动画IK控制

1、子状态机

子状态机顾名思义就是在状态机里还有一个状态机,它的主要作用就是某一个状态时由多个动作状态组合而成的复杂状态,比如某一个技能它是由3段动作组合而成的,蹲下,开火,站起,当我们释放这个技能时会连续播放这3个动作,那么我们完全可以把他们放到一个子状态机中

2、创建子状态机

在Animator Controller窗口中右键->Create Sub-State Machine

3、编辑子状态机

注意:子状态机和外部状态的相互连接方式

如果连接对象是子状态机,那么会转换到该状态机的默认状态

4、如何进行IK控制

1.在状态机的层级设置中 开启 IK 通道

2.继承MonoBehavior的类中

Unity定义了一个IK回调函数: OnAnimatorIK

我们可以在该函数中调用Unity提供的IK相关API来控制IK

3.Animator中的IK相关API

SetLookAtWeight

设置头部IK权重

SetLookAtPosition

设置头部IK看向位置

SetIKPositionWeight

设置IK位置权重

SetIKRotationWeight

设置IK旋转权重

SetIKPosition

设置IK对应的位置

SetIKRotation

设置IK对应的角度

AvatarIKGoal

枚举 四肢末端IK枚举

5、IK反向动力学控制对于我们的意义

IK在游戏开发中的应用

  • 拾取某一件物品

  • 持枪或持弓箭瞄准某一个对象

等等

6、关于OnAnimatorIK和OnAnimatorMove两个函数的理解

可以简单理解这两个函数是两个和动画相关的特殊生命周期函数

他们在Update之后LateUpdate之前调用

他们会在每帧的状态机和动画处理完后调用

OnAnimatorIK在OnAnimatorMove之前调用

OnAnimatorIK中主要处理 IK运动相关逻辑

OnAnimatorMove主要处理 动画移动以修改根运动的回调逻辑

他们存在的目的只是多了一个调用时机,当每帧的动画和状态机逻辑处理完后再调用

    private void OnAnimatorIK(int layerIndex)
    {
        //头部IK相关
        //weight:LookAt全局权重0~1
        //bodyWeight:LookAt时身体的权重0~1
        //headWeight:LookAt时头部的权重0~1
        //eyesWeight:LookAt时眼镜的权重0~1
        //clampWeight:0表示角色运动时不受限制,1表示角色完全固定无法执行LookAt,0.5表示只能够移动范围的一半
        animator.SetLookAtWeight(1, 1f, 1f);
        animator.SetLookAtPosition(pos.position);

        //animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
        animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
        //animator.SetIKPosition(AvatarIKGoal.RightFoot, pos2.position);
        animator.SetIKRotation(AvatarIKGoal.RightFoot, pos2.rotation);
    }

    private void OnAnimatorMove()
    {
        
    }

猜你喜欢

转载自blog.csdn.net/Go_Accepted/article/details/128891480