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()
{
}