学习动画系统过程中的一些笔记
概述
Unity 的动画系统基于动画剪辑(Animation Clips)的概念,每个动画剪辑可以被认为是一个单一的线性记录,由动画状态机(Animator Controller)将一个个线性记录组成类似结构化流程图的系统。动画状态机可以跟踪当前正在播放的动画剪辑,以及当动画剪辑应该改变或混合在一起时的状态信息。
Unity动画组件
Animator
Animator组件用于将动画分配给场景中的GameObject。面板及各项参数说明如下:
参数 | 说明 |
---|---|
Controller | 添加在当前角色上的 Animator 控制器 |
Avatar | 当前角色的 Avatar 系统(如果这个 Animator 使用人物角色) |
Apply Root Motion | 从动画本身或从脚本控制角色的位置和旋转 |
Update Mode | 动画的更新模式 |
-Normal | 正常模式,与 Update 更新同步。动画的速度匹配当前的时间缩放,如果时间缩放放缓,动画也会放慢速度 |
-Animate Physics | 动画与 Fixed Update 更新同步(即随同物理系统)。如果动画的物体与物理相互作用,用户应该使用该模式 |
-Unscaled Time | 更新动画与 Update 更新同步,但动画的速度忽略时间的缩放 |
Culling Mode | 动画的裁剪模式 |
-Always Animate | 动画一直会更新,不会裁剪 |
-Cull Update Transforms | 动画的 Transforms 重定向、IK 和修改转换在渲染器不可见时被禁用 |
-Cull Completely | 当动画对象的渲染器不可见时完全禁用(即不可见时停止播放动画) |
Layer
Unity 使用“Layer”(动画层)来管理身体不同部位的复杂状态机。比如用户可以使用下半身动画层来管理走动 、 跑动动作;使用上半身动画层来控制投掷 、射击动作。
动画层面板各项参数说明如下:
参数 | 说明 |
---|---|
Weight | 代表当前层的权重。比如基础层(权重固定为1)人物的手为下垂状态,第二层人物的手为举起状态,权重设为0.5,则会产生人物的手举在半空的状态 |
Mask | 遮罩。可以通过创建遮罩来屏蔽当前层影响的关节 |
Blending | Override(覆盖)意味着来自其他图层的信息将被忽略;Additive(附加)意味着动画将被添加到以前的图层之上 |
Sync | 同步层。开启后可以指定一个层使当前层的所有状态同步,不可编辑但可以替换动画。可以用来做负伤动画(动画不同但状态相同) |
Timing | 开启Sync后才能启用。启用后,同步层可以控制被同步层的持续时间 |
IK Pass | 开启后脚本才能控制IK |
Parameters
Parameters面板可以添加如下类型的参数,这些参数可以通过脚本控制,并以此来控制动画状态之间的切换。
在脚本中可以通过如下方式控制参数。
Animator Controller
动画控制器对其中使用的动画片段进行了引用,并使用所谓的状态机管理各种动画状态和它们之间的转换。
动画状态
动画状态是动画状态机中内建的基本模块。
检视面板中的各项参数说明如下:
参数 | 说明 |
---|---|
Motion | 这个状态的动画片段 |
Speed | 动画的默认速度 |
-Multiplier | 速度的乘数 |
Parameter | 是否在运行时使用动画控制器的参数调整此属性,即使用Parameters控制这个属性 |
Motion Time | 动画播放时长 |
Mirror | 是否将动画镜像 |
Cycle Offset | 周期偏移。即从动画的哪一个位置开始播放 |
Foot IK | 是否在这个动作中使用脚部IK动画 |
Write Defaults | 是否对没有动画的属性写回默认值 |
Transitions | 从这个状态产生的状态转移 |
Animation Transition
动画过渡,用来控制各个状态之间的切换。
检视面板中的各项参数说明如下:
参数 | 说明 |
---|---|
Has Exit Time | 是否等动画结束后切换 |
Exit Time | 退出当前状态的时间 |
Fiexd Duration | 如果勾选,则转换持续时间以秒为单位;反之,以%为单位 |
Transition Duration | 转换时间 |
Transition Offset | 在转换到的目的状态过程中开始播放的时间的偏移量 |
Interruption Source | 使用它来控制这种转换可能被中断的情况 |
Ordered Interruption | 确定当前转换是否可以独立于其顺序中的其他转换中断 |
Conditions | 决定该动画过渡在何时被触发 |
Animation
Unity中用于编辑物体动画的系统,总体上与视频剪辑类似,不再过多赘述。
从外部导入动画资源
Unity 可以导入原生的 Maya 文件(.mb 或者 .ma)、3ds Max(.max)、Cinema 4D 文件(.c4d)以及一般的 FBX 文件。
导入的模型可以通过Rig面板进行骨骼绑定
检视面板中的各项参数说明如下:
参数 | 说明 |
---|---|
Animation Type | 动画类型。 |
-Legacy | 传统的动画类型,如果设置为这种类型,模型下会自动生成一个Animation文件,同时游戏物体上会自动挂载Animation组件。这种方式无法通过状态机控制动画 |
-Generic | 通用的动画类型,如果设置为这种类型,需要创建骨骼映射,模型下自动生成Avatar文件,游戏物体会自动挂载Animator组件 |
-Humanoid | 人型动画类型,如果设置为这种类型,可以进行动画重定向(将一组动画应用到不同的人型角色上),同时该类型可以通过动画直接控制游戏物体的移动 |
Avatar Definition | Avatar定义,可以选择从当前模型创建,也可以选择复用其他模型的Avatar |
Skin Weights | 影响给定顶点的最大骨骼数量,默认为4个,可以自定义 |
Optimize Game Objects | 优化游戏物体,勾选后可以提高性能 |
点击Configure按钮可以进入骨骼编辑界面:
在Animation界面可以对动画片段进行剪切、设定循环、轴向锁定等设置。
IK动画
IK动画即逆向运动学功能。它可以通过给定的末端节点位置,逆推出节点链上所有其他节点的合理位置。例如希望角色的手臂触碰一个固定的物体,或脚站立在不平坦的路面上等。
常用的设置IK动画的方法如下:
分别是设置IK的位置、旋转、位置权重、旋转权重。
MatchTarget
MatchTarget方法可以提高动画的匹配度,比如人物进行翻墙动作时,原动画的手部可能并没有接触到墙壁,通过这个方法可以很好地解决。
动画混合
在状态机界面通过Create State From New Blend Tree创建一个混合树。
1D混合
2D混合
2D混合树就是通过控制两个变量进行状态间的混合。
2D混合树分为如下几种类型:
第一种适用于没有相同方向的动画混合;
第二种适用于有相同方向的动画,需要有一个(0,0)的原点;
第三种适用于两个参数类型不同的动画,如角速度和线速度。
Direct混合
将动画参数直接映射到子混合树的权重,适用于脸部动画的混合。