Unity动画系统学习笔记

Unity动画系统学习笔记Unity的动画系统有三个组成部分:动画片段Animation Clip,动画状态机Animator Controller,动画组件Animator Component。

动画片段Animation Clip

动画片段文件的本质是使用标记语言yaml编写的描述物体变化状态的文本文件。动画片段可以外部导入(如mixamo等网站,导入时可能会出现骨骼不匹配问题,需要手动调整),也可以在Unity中制作(Animation窗口)。可以在动画片段的任意帧添加动画事件,支持传入float,int,string和object四种类型的参数,当动画运行到这一帧时就会遍历对应游戏对象身上的所有组件,执行所有同名方法。

动画状态机Animator Controller

即控制多个动画文件播放和切换的工具,是Unity动画状态机的图形化交互界面。有两个标签页layers和parameters。

Layers一般用于组合动画,比如角色的不同部位播放不同的动画,layers中越下方的层级拥有越高的优先级。Parameters是用来控制动画状态的参数。动画状态分为三种:1单独的动画片段。2多个动画片段组成的混合树blendTree。混合树并不是不同动画的过渡,而是混合,所以混合的动画必须相似,常见的应用有根据角色的速度混合行走和奔跑动画,或者是角色在奔跑时向左向右转向。使用代码处理混合也是可行的,比如同时控制动画的播放速度和角色的移动速度,但是随着动画越来越复杂,这将是一个巨大的工作量。

动画状态的基本属性及其相关API:

Motion:使用的动画片段。

Speed:播放速度(速度为负值可以倒放)。

Multiplier:使最终的动画速度等于一个parameter和speed的乘积,一般用于在代码中控制动画速度。

MotionTime:播放动画片段的特定时间点,将动画固定在某一帧播放,同样使用一个parameter控制。

Mirror:镜像动画,只对人形动画有用,同样使用一个parameter控制。

Cycle Offset:开始播放动画时的起始点偏移,比如一个用于控制一个奔跑动画先迈左脚还是先迈右脚。

FootIK:一种使用了IK(反向动力学)的动画校正机制。我们常见的由美术制作或者由动作捕捉出来的固定动画,一般都是由骨骼的根节点到末梢骨骼节点依次计算其旋转位移缩放来决定每一块骨骼的最终位置,这种被称为正向动力学。但有时我们需要角色的手或者脚放在一个特定的位置上,比如爬山的时候需要手脚紧贴着山,我们只能先确定手和脚的位置,再反向计算它们各个父节点的旋转位移缩放,这种被称为反向动力学。

图中的手部和脚部的红球是Unity提供的IK Goal,Unity认为使用原来的骨骼系统时,角色的手和腿应该放在这些位置,勾选启用Foot IK后,动画播放时会通过反向动力学把对应部位会向红球处拉近一点,可以在一定程度上改善动画的不自然。手肘和膝盖处的红球是Unity提供的IK Hint,可以有效避免关节处发生不合理的扭曲。

Write Default:该属性默认开启,动画文件中被描述的旋转缩放位移即动画的属性,动画在onEnabled时会生成属性的默认值并保存下来,播放动画时Animator会将当前的状态与默认值做对比,如果当前的状态不包含某些属性,则把这些属性用默认值写入。Unity的本意是提供一个便捷的管理动画默认值的功能,但每次onEnabled后都可能更改动画属性默认值,造成了很多坑,详情可以参考[Unity] AnimatorStates中的write defaults详解_Rickshao1993的博客-CSDN博客_unity write defaut

动画组件Animator Component

Unity中对象的功能是由组件提供的,播放动画的组件就是Animator。

1替身Avatar:人形角色的动画片段描述了角色的每个部位位移旋转缩放的信息,Avatar将不同人形角色的部位映射到统一的人形骨骼上,把动画片段转化为描述统一人形骨骼部位运动的文本,从而实现同一个人形动画在不同人形角色上的复用。Unity在不同人物模式上应用标准骨骼时,会根据模型大小进行缩放,缩放的具体值可以通过animator,humanScale获取。

2 Apply Root Motion:Root Motion的官方解释是把动画上的位移应用到对象上,实际上就是动画文件会直接修改每一帧里游戏对象的坐标值和角度值,而RootMotion使用的是相对位移和转角来移动游戏对象,这使得动画播放完后不会回到第一帧的状态,而是把当前状态作为初始值继续播放。一般来说,如果我们希望把动画里的位移应用在游戏对象上,则勾选;如果希望自己编写脚本控制角色位移和旋转,则不勾选,自带位移的动画可以在一定程度上避免动画和位移不匹配的情况。也可以同时使用根运动和脚本控制,参考[Unity Tips]在脚本中使用MonoBehavior.OnAnimatorMove()和StateMachineBehavior.OnStateMove()改变根运动_发光的半导体的博客-CSDN博客_unity onanimatormove

在每个动画片段中可以进行RootMotion的详细设置,这里Unity分成了三个部分:旋转(特指绕Y轴的旋转),Y轴的位移,XZ轴的位移。Bake Into Pose的意思是勾选后会把对应部分的变化当成动画的一部分,而不是游戏对象的一部分。这个属性至关重要,能解决许多初学时动画引发的奇怪的bug,比如行走的动画由于制作的瑕疵,常常会导致角色走歪,此时就需要勾选以禁止动画中根骨骼的旋转对游戏对象的旋转产生影响;而跳跃的动画,我们不希望角色动画在空中时游戏对象的实际位置还在地面,此时就不能勾选Y轴位移的Bake Into Pose,但要注意的是这个操作会导致rigidbody的重力不起作用。Base Upon一般选择Original即可,另一个选项root node rotation是Unity根据整个动画片段自行计算出来的,不准。Offest是偏移量,可以用来修复动画方向的问题。

RootMotion最初引入的目的是同步而不是移动,所以还是需要把移动的控制权拿回来,此时可以使用onAnimatorMove方法配合rigidbody,当onAnimatorMove方法存在时,Unity就不再直接用root motion驱动游戏对象,但依然可以在状态机中获取到准确的移动速度从而避免不同步导致“脚底打滑”的情况。 updateMode:指动画刷新的模式。Normal指与帧率同步,即与update()同步;Animate Physics指与物理引擎同步,即与fixUpdate()同步;unscaled Time和Normal一样,但会忽略时间标尺Time Scale。 culling Mode:指剔除模式,指游戏对象不被摄像机看到时的处理方式。Always:不受影响;cull update Transforms:剔除IK相关动画;cull completely:完全停止动画。

动画片段间的切换

1 勾选solo后在这个方向上只执行该转换,勾选mute后不执行该转换。

2 Has Exit Time:默认勾选,当当前动画播放到某个时间点时自动执行转换,如果不勾选则必须通过Conditions代码控制主动转换。

3 Exit Time:自动转换的时间点。

4 Fixed Duration:勾选时转换过渡时间以秒计算,不勾选时过渡时间以百分比计算。

5 Transition Offset:动画切换时下一个状态开始播放的偏移量。

6 Interruption Source:有哪些转换可以打断当前的转换,默认None,不可以打断;CurrentState从当前状态出发的转换可以打断当前转换;NextState从下一个状态出发的所有转换都可以打断当前转换,此时OrderedInterruption无法被勾选;CurrentStateThenNextState当前状态和下一个状态出发的转换都可以打断当前转换,但当前状态出发的转换优先级更高;NextStateThenCurrentState与CurrentStateThenNextState相反。

7 OrderedInterruption:默认勾选,只有优先级比当前转换高的转换才可以打断当前转换。取消勾选则无视优先级,都可以打断。8 Conditions:动画发生转换需要同时满足的条件,与parameters相关联。

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务