Unity 动画系统

Mecanim 简介

Unity 的动画系统英文名为: Mecanim, 是一个丰富而复杂的系统. 它支持从模型中直接导入的动画 (Model Import Settings), 也支持直接在 Unity 中创建的或录制的动画.

Unity 中动画的最小单位是 "动画剪辑 (Animation Clip)", 这是最小的一个动画单位, 里面包含了对游戏物体的 "位置", "旋转", "缩放", "颜色" 等等很多属性的变化规则. 但是这些动画剪辑并不能直接应用到游戏物体上, 而是需要先在一个叫做 "Animation Controller" 的系统中对这些动画进行设置才行, 包括动画的播放条件, 动画之间的转换规则, 还可以使用遮罩来设置动画的生效范围等.

使用 "Animation Controller" 将多个动画剪辑设置好规则之后, 就可以将这个 "Animation Controller" 应用到游戏物体上了, Unity 有一个叫做 "Animator" 的游戏组件可以使用并解析 "Animation Controller".

这样一个动画从导入或创建直到最后控制游戏物体的动作的整个流程就完成了.

Mecanim

  1. Project 中的动画放置到 Animation Controller 中
  2. 在 Animation Controller 中混合动画生成一个 Animation Controller 文件
  3. 人物骨骼文件加骨骼遮罩文件生成 Avatar 文件
  4. Animator 组件引用前面的 Animation Controller 文件和 Avatar 文件.

Animation Clip 的来源

Unity 支持从外部源导入动画, 并允许在编辑器中使用 Animation 窗口从头开始创建动画剪辑.

Model Animation Clip Import

要将模型动画导入到 Unity 中, 需要在模型导入页面的 Animation 选项卡中对动画进行帧数剪辑以及循环帧调整, 具体见另一篇模型导入的博客. 跳转

Record Animation Clip

在 Unity 的 Animation 窗口中还可以创建和编辑动画剪辑.

AnimationWindow

左侧最下方的 "Dopesheet" 是关键帧查看模式, "Curves" 是曲线查看模式. 录制动画时关注点是关键帧, 所以使用关键帧模式, 但是调整动画时, 必须使用曲线模式, 因为 Unity 默认使用平滑插值曲线, 但是有些时候我们会希望使用线性动画曲, 因此必须打开曲线模式查看关键帧之间的过渡方式.

选中想要查看的动画属性, 之后按下 F 键可以将右侧的视图缩放到适合观察这几个属性的缩放级别, 便于观察.

按下 A 键则可以快速将右侧的视图缩放至查看全部动画属性的缩放级别.

AnimationWindowRecord

Preview: 启用时 Scene 窗口中会实时预览动画的样子, 关闭后 Scene 不会进行实时预览.

第二个按钮是: 录制模式 [注] 如果打开录制模式, 那么预览模式也会始终打开.

右侧时间线的标题颜色, 在预览模式下是蓝色的, 在录制模式下是红色的.

后面的按钮分别是:

  • 将播放的开头移到动画的开头.
  • 将播放的开头移到动画的上一个关键帧.
  • 将播放的开头移到动画的下一个关键帧.
  • 将播放的开头移到动画的结尾.

还可使用以下键盘快捷键来控制动画播放开头:

快捷键 作用
, 跳到上一帧
. 跳到下一帧
Alt + , 跳到上一个关键帧
Alt + . 跳到下一个关键帧

Animation Events

时间线区域可以给动画添加动画事件, 动画的事件函数还可以接收一个参数, 这个参数可以是: float, string, int, object, AnimationEvent 类型, 其中 AnimationEvent 类型可以将动画的很多信息一次性全部传给动画事件函数.

Animation Controller

Animation Controller 使用一种 "状态机" 的方式来管理所有的动画剪辑, 通过打开 Animator 窗口便可以看到图形化的状态机.

AnimatorWindow

  • Entry: 进入状态机的入口, 会连接一个初始的动画剪辑, 默认的动画剪辑为橙色, 过度线也是橙色. 另外 Entry 也可以使用普通的过渡条件过渡到其他的动画类型.

AnimatorWindowEntry

  • Any State, 任意状态, 是一个始终存在的特殊状态. 当某个状态 "无论当前是什么状态, 只要满足要求均可以跳转过去" 的时候, 使用 Any State 将十分方便. 另外 Unity 不允许将 Any State 作为退出过渡动画.

  • Exit 出口, 退出状态机的出口.

Sub-State Machine

[常用] Sub-State Machine, 译为: 子状态机, 可以理解为就是动画剪辑在状态机中的一个文件夹, 当动画剪辑特别多的时候, 可以用来很方便的整理和规划所有的动画剪辑.

Blend Tree

动画混合树.

1
// TODO...

过渡条件

1
// TODO...

Animation Clip 单个动画剪辑

Solo 和 Mute 功能

这个功能主要应用于动画测试. 测试的时候一般需要控制变量, 每次测试都是测试特定的一条动画转换, 因此需要其他的动画切换此时就非常碍事了. 可以使用 Solo 仅启用勾选了 Solo 的动画过渡, 剩余的全部禁用.

而有时候需要仅禁用一个动画转换, 其他的全部都要启用, 测试就可以使用 Mute 只禁用掉勾选了 Mute 的动画过渡, 剩余的全部启用.

Unity 允许 Solo 和 Mute 同时勾选, 但是为了方便理解, 禁止 1 条动画过渡同时勾选 Solo 和 Mute, 同时在使用这个功能时, 只允许同时使用其中一种, 禁止两种同时使用.

勾选了 Solo 的过渡箭头为绿色, 勾选了 Mute 的过渡箭头为红色.

Animator 组件

Animator 组件挂载在游戏物体上, 其中需要引用 Animation Controller, 人形游戏物体还需要引用 Avatar.

参数 含义
Controller 引用管理此角色动画的 Animator Controller
Avatar 人形角色的 Avatar
Apply Root Motion 勾选后, 在动画播放期间, 物体的运动相关参数完全由动画本身接管, 此时脚本控制无效. 取消勾选后, 则是由脚本来控制物体的运动参数
Update Mode Normal: 与 Update 调用同步更新, 同时动画的速度与游戏时间标度一致; Animate Physics: 与 FixedUpdate 调用同步更新, 如果要对具有物理交互的对象的运动进行动画化, 应使用此模式, 例如可四处推动刚体对象的角色; Unscaled Time: 与 Update 调用同步更新, 但是动画的速度永远以 100% 的速度播放, 与时间标度无关. 应用于 UI 动画.
Culling Mode 动画剔除模式, Always Animate: 始终进行动画化; Cull Update Transforms: 剔除 Transform 的更新, 未显示时禁用 Transform 的重定向, IK和写入; Cull Completely: 完全剔除, 未显示时完全禁用动画

Timeline

1
// TODO...