Animator 概述
# Animator 概述
Animator (Mecanim)具有功能:
为 Unity 的所有元素(包括对象、角色和属性)提供简单工作流程和动画设置。
支持导入的动画剪辑以及 Unity 内创建的动画
人形动画重定向 - 能够将动画从一个角色模型应用到另一角色模型。
对齐动画剪辑的简化工作流程。
方便预览动画剪辑以及它们之间的过渡和交互。因此,动画师与工程师之间的工作更加独立,使动画师能够在挂入游戏代码之前为动画构建原型并进行预览。
提供可视化编程工具来管理动画之间的复杂交互。
以不同逻辑对不同身体部位进行动画化。
分层和遮罩功能
# 动画工作流程
Unity
的动画系统基于动画剪辑的概念;动画剪辑包含某些对象应如何随时间改变其位置、旋转或其他属性的相关信息。每个剪辑可视为单个线性录制。来自外部的动画剪辑由美术师或动画师使用第三方工具(例如 Max
或 Maya
)创建而成,或者来自动作捕捉工作室或其他来源。
然后,动画剪辑将编入称为 Animator Controller
的一个类似于流程图的结构化系统中。Animator Controller
充当“状态机”,负责跟踪当前应该播放哪个剪辑以及动画应该何时改变或混合在一起。
一个非常简单的 Animator Controller
可能只包含一个或两个剪辑,例如,使用此剪辑来控制能量块旋转和弹跳,或设置正确时间开门和关门的动画。一个更高级的 Animator Controller
可包含用于主角所有动作的几十段人形动画,并可能同时在多个剪辑之间进行混合,从而当玩家在场景中移动时提供流畅的动作。
Unity
的动画系统还具有用于处理人形角色的许多特殊功能。这些功能可让人形动画从任何来源(例如:动作捕捉
、Asset Store
或某个其他第三方动画库)重定向到您的角色模型中,并可调整肌肉定义。这些特殊功能由 Unity 的替身系统启用;在此系统中,人形角色会被映射到一种通用的内部格式中。
所有这些部分(动画剪辑、Animator Controller 和 Avatar)都通过 Animator 组件一起附加到某个游戏对象上。该组件引用了Animator Controller,并(在必需时)引用此模型的 Avatar。Animator Controller又进一步包含所使用的动画剪辑的引用。
上图显示了以下内容:
动画剪辑是从外部来源导入的或在
Unity
内创建的。在此示例中,它们是导入的动作捕捉人形动画。动画剪辑显示并排列在
Animator Controller
中。因此,在Animator
窗口中会显示Animator Controller
的视图。状态(可表示动画或嵌套的子状态机)显示为通过线条连接的节点。此Animator Controller
作为资源存在于Project
窗口中。骨架角色模型(在本示例中为宇航员“Astrella”)具有映射到
Unity
常见替身格式骨骼的特定配置。此映射作为导入的角色模型的一部分存储为Avatar
资源,并且在Project
窗口中显示(如图所示)。对角色模型进行动画化时,角色模型会附带一个
Animator
组件。在上图所示的Inspector
视图中,您可以看到一个Animator
组件,该组件已被分配了Animator Controller
和替身。Animator
将这些一起用于对模型的动画化过程。仅在对人形角色进行动画化时,才需要引用Avatar
。对于其他动画类型,只需Animator Controller
。
# 动画术语表
动画剪辑术语:
术语 | 定义 |
---|---|
动画剪辑 (Animation Clip) | 可用于动画角色或简单动画的动画数据。这是一种简单的单位动作,例如“空闲”、“行走”或“奔跑”(其中一个具体实例)。 |
动画曲线 (Animation Curves) | 曲线可以附加到动画剪辑,并由游戏中的各种参数控制。 |
Avatar 遮罩 (Avatar Mask) | 为骨架指定要包含或排除哪些身体部位。在动画层和导入器中使用。 |
Avatar 术语:
术语: | 定义 |
---|---|
Avatar | 用于将一个骨架重定向到另一个骨架的接口。 |
重定向 (Retargeting) | 将为一个模型创建的动画应用于另一个模型。 |
绑定 (Rigging) | 为网格构建骨关节的骨架层级视图的过程。使用外部工具(例如 Autodesk® 3ds Max® 或 Autodesk® Maya®)执行。 |
蒙皮 (Skinning) | 将骨关节绑定到角色的网格或“皮肤”的过程。使用外部工具(例如 Autodesk® 3ds Max® 或 Autodesk® Maya®)执行。 |
肌肉的定义 (Muscle definition) | 这使您可以更直观地控制角色的骨架。Avatar 就位后,动画系统在肌肉空间内工作,这比在骨骼空间内更直观。 |
T 形姿势 | 角色手臂伸向两侧而形成一个“T”形的姿势。为了形成 Avatar,角色必须摆出此姿势。 |
绑定姿势 (Bind-pose) | 对角色建模的姿势。 |
人体模板 (Human template) | 预定义的骨骼映射。用于将 FBX 文件中的骨骼与 Avatar 匹配。 |
移动自由度 (Translate DoF) | 与移动相关的三个自由度(X、Y 和 Z 方向的运动),与旋转相反。 |
# 重定向人形动画
Mecanim
的最强大功能之一是重定向人形动画。这意味着您可以相对轻松地将同一组动画应用于各种角色模型。重定向只适用于已配置了Avatar
的人形模型,因为这可以让我们在模型的骨骼结构之间建立对应关系。
建议的层级视图结构:
使用 Mecanim
动画时,您可以期望场景包含以下元素:
- 已导入的具有 Avatar 的角色模型。
- 引用 Animator Controller 资源的 Animator 组件。
- 从 Animator Controller 引用的一组动画剪辑。
- 角色的脚本。
- 角色相关组件,例如角色控制器。
项目还应包含具备有效 Avatar
的另一个角色模型。
在层级视图中,创建包含角色相关组件的游戏对象
将模型作为游戏对象的子代与 Animator 组件放在一起
确保引用 Animator 的脚本正在寻找子代(而不是根)中的 Animator;使用 GetComponentInChildren
() 而不是 GetComponent ()。
然后,为了在另一个模型上复用相同动画,您需要:
禁用原始模型
将所需模型作为游戏对象的另一子代拖入
确保新模型的 Animator Controller 属性正在引用同一控制器资源
调整顶级游戏对象上的角色控制器、变换和其他属性以确保动画与新模型顺利融合。
# 性能和优化
动画系统
控制器: 未设置控制器的
Animator
不会花时间执行处理。简单动画: 播放没有混合的单个动画剪辑会使 Unity 的速度比旧版动画系统更慢。旧系统非常直接,对曲线采样并直接写入变换中。Unity 的当前动画系统具有用于混合的临时缓冲区,并会对采样曲线和其他数据进行额外复制。当前系统布局已针对动画混合和更复杂设置进行优化。
缩放曲线: 动画化缩放曲线比动画化移动和旋转曲线的成本更高。为了改善性能,请避免使用缩放动画。
注意:这不适用于常量曲线(具有相同动画剪辑长度值的曲线)。常量曲线经过优化,成本低于比普通曲线。常量曲线的值与默认场景值相同时,常量曲线不会每帧都写入场景。
层: 大多数时间,Unity 都在估算动画,并将动画层和动画状态机的开销保持在最低水平。向
Animator
添加另一层(无论同步与否)的成本取决于层播放的动画和混合树。层的权重为零时,Unity 会跳过层更新。
人形动画类型与通用动画类型
导入人形动画时: 如果不需要
IK(反向动力学)
目标或手指动画,请使用Avatar
遮罩 将它们移除。使用通用类型时: 使用根运动比不使用根运动的成本更高。如果动画没有使用根运动,请确保未指定根骨骼。
场景级别优化
使用哈希而不是字符串来查询
Animator
。实现一个小的
AI
层来控制Animator
。您可以让它为OnStateChange
、OnTransitionBegin
和其他事件提供简单回调。使用状态标记可轻松地将
AI
状态机与Unity
状态机匹配。使用其他曲线来模拟事件。
使用其他曲线来标记动画;例如,与目标匹配一起使用。
运行时优化
- 可见性和更新: 始终通过将
Animator
的Culling Mode
设置为Based on Renderers
来优化动画,并禁用蒙皮网格渲染器的Update When Offscreen
属性。这样即可在角色不可见时让Unity
不必更新动画。
- 可见性和更新: 始终通过将