【总结】Unity动画模块
动画模块没有太多好说的,更多是练习积累的经验
Animator动画控制器
- AnimatorControllerLayer 状态层,layer层级越高,动作优先级越高
- AnimatorStateMachine 状态机
- SubAnimatorStateMachine 子状态机
RuntimeAnimatorController 运行时动画状态机
Animate Physics 适合动画有物理的相互作用
ApplyRootMotion 用动画还是脚本控制位置
Culling Mode 动画裁剪
Write Default 将动画改变的数据结束动画后复原
Transition
- Transition Offset部分的next State是不会执行的
- Duration 部分是两个动画的混合。fixed duration 打钩的话 duration会以秒计算,而不是根据state的长度
- order interrupt 是否只能被高优先级的transition打断?
当勾上时,可以选择
Value | Function |
---|---|
None |
這個transition不會被打斷
|
Current State |
目前State的其他transition如果達成條件,會打斷目前的transition
|
Next State |
下一個State的其他transition如果達成條件,會打斷目前的transition
|
Current State then Next State
|
都可以打斷,只是由Current State優先
|
Next State then Current State |
都可以打斷,只是由Next State優先
|
意思就是说,勾选后,更高优先级的Transition可以打断当前这个Transition,比如我们要用AnyState到Hurt状态,如果此时正在发生其他状态间的Transition,那么设置None的话就只能等这个Transition结束才能切换到Hurt了。但是用其他选项就可以打断
可以用打断实现一些比较特殊的动画,比如硬直结束后可操作的攻击动画
Solo 和 Mute 的功能
不用变量控制的状态转移
- Mute:禁用状态转移(哑掉transition);
- 如果不选择solo,在没有变量控制(结束条件为“exit time”)的情况下,该状态优先选择动作列表中最前(或者说最上的)的状态转移;
- 如果选择了某个solo,那么在没有变量控制(结束条件为“exit time”)的情况下,优先选择标记solo的状态转移;
- 如果有多个状态转移选中了solo,那么优先选择这些已选中solo的状态转移中,在动作列表中靠前的状态转移;
基本的原则是,如果一个状态被标记为solo,那么其余的状态转移将被视为选中mute;
如果solo和mute同时被选中,那么mute的优先级更高(即视为只选中了mute)
连击的Transiton
问题目标:如combo1,至少播放0.6倍的动画,然后如果有输入就转换状态
判断输入的时间必须要小于exit time,有exitTime时transition的判断发生在exit time结束时,过了exit time就不进行condition判断了
Dawnblade中不用exit time,而是交给程序控制,何时可接受输入并切换
Blend Tree 动画混合树
1D就是一个参数混合多个动画
2D就是两个参数混合多个动画,一个XY空间中,点距哪个动画近就受其影响大
其他
AnimatorStateInfo
Animator.StringToHash
Animation帧动画
AnimationCurve
AnimationEvent
IK:正向运动学,根骨骼带动子节点骨骼运动
FK:反向运动学,由子节点带动父节点运动。
在Animator窗口中,对于要使用IK的动画状态勾上Foot IK选项,在Base Layer中勾上IK Pass选项。然后在代码中实现OnAnimatorIK函数来控制IK
Animator.SetIKPosition
SetIKRotation
SetIKPositionWeight
SetIKHintPosition
SetLookAtWeight
……
动画重定向
同一套Avatar骨骼的不同角色,动画绝对可以重用
动态控制动画帧事件
可以用Animator.animationClips获取,然后设置AnimationEvent触发time,functionName
AnimatorOverrideController 运行时修改挂载的clip