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