Animator
1. 准备工作
a) 通过FBX创建AnimationClip文件。(目的:更新动作后不会对动作状态机产生影响)
核心代码:
b) 替换动画状态机内的文件(目的:动画文件进行修改后,替换进入动画状态机)
核心代码:
2. 创建动画状态机
基本原则:状态之间的转换都需要经过Idle
平行状态使用Blend Tree_1D,通过Float变量进行控制(比如:角色吃饭,睡觉,交谈等目的:减少参数数量,使用BlendTree设置效果和使用多个Trigger设置所达到的效果是一样的)
通过子状态机和BlendTree的使用简化AnimatorController以及使用的参数数量
使用AnimatorOverrideController
使用AvatarMask
使用IK
3. 驱动动画状态机
a) SetTrigger()/SetInt()/SetBool()/SetFloat()设置参数,控制状态
b) AnimatorStateInfo获取当前状态
c) AnimatorStateInfo.normalizedTime获取当前播放进度
d) Anim.IsInTransition (0) 判断是否在过渡
e) 控制脚本主要提供方法 PlayAnim(AnimType type)/Reset()
f) 使用协同程序等待进入Idle状态后,再进行下一个状态的转换
4. 遇到的问题
a) BlendTree:
i. Speed = 1/-1 正向/反响播放(eg:抽刀,收刀)
ii. AdjustTimeScale:Homogeneous Speed(通过对Speed的调整,统一BlendTree中的动作)
b) ResetTrigger() 可以将Bool类型参数还原
c) 动画过渡(Transitions Setting)细活
d) 移动速度和动作播放速度的匹配
e) 滑步问题
i. 出现滑步的基本原因是移动速度和动画播放不匹配
ii. NavmeshAgent + AnimatorController
从Walk->Idle,NavmeshAgent.velocity.magnitude =0后,切换Idle状态。
f) 状态的转换
i. HasExitTime
ii. AnimatorStateInfo.normalizedTime>0.8f+ 参数控制