点击访问官网 Animator Controller
1、Animator Controller 简介
Animator Controller 可以为角色或对象安排和维护一组动画片段以及关联的动画过渡。
在大多数情况下,拥有多个动画并在满足某些游戏条件时在这些动画之间切换是很常见的。例如,只要按下空格键,就可以从行走动画片段切换到跳跃动画片段。但是,即使仅有一个动画片段,仍需要将其放入 Animator Controller
以便将其用于游戏对象。
第一次创建动画片段时,Unity 会自动创建 Animator Controller。
不过为了方便管理,我们一般要手动创建 Animator Controller
(右键单击 Project 窗口,然后单击 Create > Animator Controller)。
◆ 快捷键:
- 选中某一个状态,按 F 聚焦
- 按 A 可将所有动画状态调整到 Animator Controller 视图中
- 按 A 和 F 可在所选动画状态与整个 Animator Controller 之间切换
在播放模式期间,Animator 会平移视图,以便始终能看到正在播放的当前状态。Animator Controller 遵循基础层和子状态机的独立缩放因子,而窗口将自动平移以确保活动状态的可见性。
2、创建 Animator Controller
点击访问官网 创建AnimatorController
右键 --> Create --> Animator Controller
- 这两处的按钮都一样,都能打开 Animator 面板
Window --> Animation --> Animator
Inspector(点击创建的Animator Controller) --> Open
3、Animator 窗口
点击访问官网 Animator 窗口
在 Animator 窗口中可创建、查看和修改 Animator Controller 资源。
Animator 窗口有两个主要部分:
- 左侧 Layers 和 Parameters 面板
- 主要网格化布局区域
单击
眼睛
图标开关即可显示或隐藏 Parameters 和 Layers 侧面板,从而提供更多空间来查看和编辑状态机。启用
锁
图标将使 Animator 窗口聚焦于当前状态机。锁图标为关闭状态时,如果单击新的 Animator 资源或带有 Animator 组件的游戏对象,则会切换 Animator 窗口以显示该项的状态机。锁定该窗口后,无论选择其他任何资源或游戏对象,Animator 窗口均一直显示同一状态机。
3.1、Layers 面板
Layers 视图
允许你在 Animator Controller 中创建、查看和编辑 层(Layers)。因此,可在单个动画控制器中同时运行多个动画层,每个动画层由一个单独状态机控制。此情况的常见用途是在控制角色一般运动动画的基础层之上设置一个单独层来播放上身动画。
单击加号图标添加层,按 Delete 删除层。
Unity 使用__动画层__来管理不同身体部位的复杂状态机。相应的示例为,你有一个用于行走/跳跃的下身层,还有一个用于投掷物体/射击的上身层。
点击访问官网 动画层
单击窗口右侧的齿轮可显示该层的设置。
在每个层上,可以指定遮罩和混合类型。遮罩指定要在其上应用动画的身体部位。混合类型(Blending)指定动画的应用方式。
- Override:在该层上使用动画,替换先前层上的动画。
- Additive:将此层上的动画添加到先前层中动画的顶部。
- 为了使添加混合成功,添加层上的动画必须包含与前一层相同的属性。
按小部件上方的 + 添加一个新层。
Mask 属性用于 指定此层上使用遮罩。例如,如果你想只在模型的上半身播放投掷动画,同时让角色也能够行走、奔跑或站着不动,则可以在播放投掷动画的层上使用遮罩,其中定义了上半身部分,如下所示:
Layers 侧边栏中显示 M 符号,表示该层已应用遮罩。
★ 动画层同步
有时,能够在不同层中复用同一状态机是很有用的。例如,如果想要模拟“受伤”行为,并生成“受伤”状态下的行走/奔跑/跳跃动画,而不是“健康”状态下的动画,您可以单击其中一个层上的 Sync 复选框,然后选择要同步的层。随后状态机的结构便会相同,但状态使用的实际动画剪辑不同。
通过 Timing 复选框,Animator 可调整同步层中每个动画所需的时间(由权重决定)。如果取消选中 Timing,则会调整同步层上的动画。该调整会将动画的长度拉伸到与原始层上的一致。如果选中该选项,则动画长度将在两个动画之间平衡(基于权重)。在两种情况下(选中和不选中),Animator 都将调整动画的长度。如果不选中,则原始层将是唯一母版。如果选中,则采用折中方案。
Layers 侧边栏中显示 S 符号,表示该层是同步层。
3.2、Parameters 面板
Parameters 视图
允许你创建、查看和编辑 Animator Controller 参数。这些参数是你定义的变量,充当状态机的输入。
单击加号图标,从弹出菜单中选择参数类型进行添加。按 Delete 删除参数。
动画参数是在 Animator Controller 中定义的变量,可从脚本访问这些变量并向其赋值。这是脚本控制或影响状态机流程的方法。
点击访问官网 动画参数
可使用以下 Animator 类中的函数,从脚本为参数赋值:SetFloat、SetInteger、SetBool、SetTrigger 和 ResetTrigger。
using UnityEngine;
using System.Collections;
public class SimplePlayer : MonoBehaviour {
Animator animator;
// 使用此函数进行初始化
void Start () {
animator = GetComponent<Animator>();
}
// 每帧调用一次 Update
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
bool fire = Input.GetButtonDown("Fire1");
animator.SetFloat("Forward",v);
animator.SetFloat("Strafe",h);
animator.SetBool("Fire", fire);
}
void OnCollisionEnter(Collision col) {
if (col.gameObject.CompareTag("Enemy"))
{
animator.SetTrigger("Die");
}
}
}
3.3、网格化布局区域
带有深灰色网格的主要部分是布局区域。使用此区域可在Animator Controller中创建、排列和连接状态
右键单击该网格以创建新的状态节点。使用鼠标中键或按住 Alt/Option 键拖拽可平移视图。通过单击可选择状态节点以进行编辑,而通过单击并拖动状态节点可重新排列状态机的布局。
4、动画状态机
角色或其他动画游戏对象通常具有若干不同的动画,这些动画对应于该角色或对象可在游戏中执行的不同动作。例如,角色可以在空闲时轻微呼吸或摇摆,在得到指令时行走,以及从平台上跌落时恐慌地抬起手臂。一扇门可能具有打开、关闭、卡住和撞开动作的动画。Mecanim 使用类似于流程图的可视化布局系统来表示状态机,从而控制需要在角色或对象上使用的动画剪辑并对这些动画剪辑排序。本部分将提供有关 Mecanim 状态机的更多详细信息,并说明如何使用这些状态机。
4.1、状态机基础
点击访问官网 状态机基础
在某种意义上,角色处于行走、空闲或者其它的“状态”中。一般来说,角色从一个状态立即切换到另一个状态是需要一定的限制条件的。比如角色只能从跑步状态切换到跑跳状态,而不能直接由静止状态切换到跑跳状态。角色从当前状态进入下一个状态的选项被称为状态过渡条件。状态集合、状态过渡条件以及记录当前状态的变量放在一起,形成了一个状态机。
Animator 窗口中的每个视图都有一个进入 (``Entry) 和退出 (
Exit`) 节点。在状态机过渡期间使用这些节点。
Any State 任意状态:
Any State 是一种总是存在的特殊状态。它适用于无论当前处于哪个状态,都希望进入特定状态的情况。这是一种将相同的向外转换添加到机器中所有状态的简写方式。请注意,任何状态的特殊含义意味着它不能成为转换的终点(即,跳到 Any State 不能用作选择随机状态进入下一个状态的方式)。
4.2、States-动画状态
点击访问官网 States-动画状态
◆ 属性:
属性 | 描述 |
---|---|
Motion | 指定给该状态的动画片段或混合树。 |
Speed | 此状态的默认运动速度。 勾选 Parameter可以使用脚本中的自定义值修改速度。 例如,可以将速度与自定义值相乘,以减速或加速播放速度。 |
Motion Time | 用于播放此状态的运动的时间。 勾选 Parameter可以使用脚本中的自定义值控制运动时间。 |
Mirror | 此属性仅适用于具有类人动画的状态。 启用以镜像此状态的动画。 勾选 Parameter可以启用或禁用脚本中的镜像。 |
Cycle Offset | 添加到运动的状态时间的偏移。 此偏移不会影响 Motion Time。 勾选 Parameter可以指定脚本的周期偏移。 |
Foot IK | 此属性仅适用于具有类人动画的状态。启用以注重此状态的 Foot IK。 |
Write Defaults | 动画状态是否为未通过其运动设置动画的特性写入默认值。 |
Transitions | 源自此状态的转换列表。 |
4.3、Transitions-状态机过渡
点击访问官网 Transitions-状态机过渡
**动画过渡允许 状态机 从一个动画状态切换或混合到另一动画状态。**过渡不仅定义状态之间的混合应该耗费多长时间,而且还定义它们应该在什么条件下激活。您可以设置仅在特定条件成立时才发生过渡。要设置这些条件,请在 Animator Controller 中指定参数值。
点击访问官网 动画过渡
在任何给定时间只能有一个激活的过渡。但是,当前激活的过渡可能会被另一个过渡中断(如果已将设置配置为允许此行为,请参阅 过渡中断)。
4.3.1、过渡属性
属性 | 功能 |
---|---|
Has Exit Time | Exit Time 是一种不依赖参数的特殊过渡。 但它依赖状态的标准化时间。选中此选项可在 Exit Time 指定的具体时间进行过渡。 |
Settings | 包含详细过渡设置的折叠菜单(如下所示)。 |
Exit Time | 如果选中 Has Exit Time,此值表示过渡可以生效的确切时间。 该时间以标准化时间表示(例如,退出时间为 0.75 表示,在已播放 75% 动画的第一帧上,Exit Time 条件为 true, 在下一帧上,该条件为 false)。 对于循环动画,每个循环都会评估退出时间小于 1 的过渡,因此可使用此选项在每个循环的动画中以适当时机对过渡进行计时。 对 Exit Time 大于 1 的过渡仅评估一次,因此此类过渡可用于在固定循环次数后的特定时间退出。 例如,过渡的退出时间为 3.5 的情况下,在三个半循环后对该过渡评估一次。 |
Fixed Duration | 如果选中 Fixed Duration 复选框,则以秒为单位解读过渡时间。 如果未选中 Fixed Duration 复选框,则过渡时间解读为源状态的标准化时间的一部分。 |
Transition Duration | 相对于当前状态持续时间的过渡持续时间,以标准化时间或秒为单位(具体取决于 Fixed Duration 模式)。 此时间在过渡图中显示为两个蓝色标记之间的部分。 |
Transition Offset | 过渡到的目标状态的起始播放的时间偏移。 例如,值为 0.5 表示目标状态在其时间轴的 50% 处开始播放。 |
Interruption Source | 此选项用于控制该过渡可能中断的情况(请参阅下文的 过渡中断)。 |
Ordered Interruption | 确定当前过渡是否可在不考虑顺序的情况下被其他过渡中断(请参阅下文的 过渡中断)。 |
Conditions | 一个过渡可以具有单个条件、多个条件或根本没有条件。 如果过渡没有条件,Unity Editor 只会考虑 Exit Time,并在达到退出时间时发生过渡。 如果过渡有一个或多个条件,则必须满足所有条件才能触发过渡。 一个条件包含: ● 一个事件参数(在条件中考虑其值)。 ● 条件谓词(需要时填写,例如,浮点数的“小于”或“大于”)。 ● 一个参数值(需要时填写)。 如果为该过渡选择 Has Exit Time 并有一个或多个条件,请注意 Unity Editor 在 Exit Time 之后考虑条件是否为 true。这样可确保在动画的特定部分中进行过渡。 |
4.3.2、过度中断
使用 Interruption Source 和 Ordered Interruption 属性可控制如何中断过渡。
在概念上,中断顺序就像这些过渡已排队,然后解析为一个有效过渡从第一个过渡插入到最后一个过渡。
Interruption Source 属性
AnyState 中的过渡始终首先添加在队列中,然后其他过渡根据 Interruption Source 的值排队:
值 | 功能 |
---|---|
None | 不再添加任何过渡。 |
Current State | 将当前状态的过渡排队。 |
Next State | 使下一状态的过渡进行排队。 |
Current State then Next State | 将当前状态的过渡排序,然后将下一状态的过渡排序。 |
Next State then Current State | 将下一状态的过渡排队,然后将当前状态的过渡排队。 |
Ordered Interruption 属性
Ordered Interruption 属性将更改队列的解析方式。
根据该属性的值,对队列的解析将在以下列出的不同时间结束。
值 | 结束时间 |
---|---|
选中 | 已找到有效过渡或当前过渡。 |
取消选中 | 已找到有效过渡。 |
只有 AnyState 过渡才能被自身中断。
要了解有关过渡中断的更多信息,请参阅 Unity 博客文章 状态机过渡中断 (State Machine Transition Interruptions)。
4.3.3、过渡图
要手动调整以上列出的设置,可直接在字段中输入数字或使用过渡图。在操作视图元素时,过渡图会修改上述值。
● 请根据以下说明更改图形视图中的过渡属性:
- 拖动 Duration “out” 标记可更改过渡的 持续时间 (Duration)。
- 拖动 Duration “in” 标记可更改过渡的持续时间以及 退出时间 (Exit Time)。
- 拖动目标状态可调整 过渡偏移 (Transition Offset)。
- 拖动预览播放游标可在 Inspector 底部的预览窗口中快速预览动画混合(效果)。
◆ 混合树状态之间的过渡
如果属于此过渡的当前状态或下一状态是混合树状态,则混合树参数将出现在 Inspector 中。通过调整这些值可预览在混合树值设置为不同配置时的过渡表现情况。 如果混合树包含不同长度的剪辑,您应该测试在显示短剪辑和长剪辑时的过渡表现。调整这些值不会影响过渡在运行时的行为方式;它们仅用于帮助您预览不同条件下的过渡表现情况。
◆ 条件
一个过渡可以具有单个条件、多个条件或根本没有条件。如果过渡没有条件,Unity Editor 只会考虑 Exit Time,并在达到退出时间时发生过渡。如果过渡有一个或多个条件,则必须满足所有条件才能触发过渡。
一个条件包含:
- 一个事件参数(在条件中考虑其值)。
- 条件谓词(需要时填写,例如,浮点数的小于或大于)。
- 一个参数值(需要时填写)。
如果为该过渡启用 Has Exit Time 并有一个或多个条件,仅在状态的退出时间之后才会检查这些条件。这样可确保仅在动画的特定部分中进行过渡。
4.4、Behaviours-状态机行为
点击访问官网 Behaviours-状态机行为
状态机行为是一类特殊脚本。与将常规 Unity 脚本 (MonoBehaviour) 附加到单个游戏对象类似,您可以将 StateMachineBehaviour 脚本附加到状态机中的单个状态。因此可编写一些将在状态机进入、退出或保持在特定状态时执行的代码。这意味着您不必编写自己的逻辑来测试和检测状态的变化。
◆ 此功能的一些用例可能包括:
- 在进入或退出状态时播放声音
- 仅在相应状态下执行某些测试(例如,地面检测)
- 激活和控制与特定状态相关的特效
创建状态机行为并将其添加到状态的方式与创建脚本并将其添加到游戏对象的方式非常类似。在状态机中选择状态,然后在检视面板中使用“Add Behaviour”按钮来选择现有的 StateMachineBehaviour 或创建新行为。
状态机行为脚本可访问在 Animator 进入、更新和退出不同状态(或子状态机)时调用的许多事件。此外,还有一些事件允许您处理根运动和反向运动学调用。
有关更多信息,请参阅 状态机行为 脚本参考。
4.5、Sub-State Machines 子状态机
点击访问官网 Sub-State Machines 子状态机
角色通常具有包含若干阶段的复杂动作。合理的做法是识别单独阶段并将单独状态用于每个阶段,而不是用单个状态来处理整个动作。
例如,角色可能会有一个名为“Trickshot”(花式射击)的动作;在此动作中,角色会蹲下来稳定瞄准,射击,然后再站起来。
虽然这对于控制目的很有用,但缺点是随着添加更多的此类复杂动作,状态机将变得庞大而笨拙。在编辑器中用空白空间在视觉上对状态组进行分隔,可略微化简一下。但是,Mecanim 比这更进一步,允许您将一组状态折叠为状态机图中的单个指定项。这些折叠的状态组称为 子状态机。
若要创建子状态机,可右键单击 Animator Controller 窗口中的空白空间,并从上下文菜单中选择 Create Sub-State Machine
。子状态机在编辑器中用细长六边形表示以区别于正常状态。
双击六边形时将清理编辑器,让编辑子状态机,好像它本身就是一个完全独立的状态机。窗口顶栏会显示“示踪导航路径”以指示当前正在编辑的子状态机(注意,可在其他子状态机内创建子状态机,以此类推)。单击跟踪路径中的某项将使编辑器聚焦于该特定子状态机。
★ 外部过渡
如上所述,子状态机只是一种在编辑器中直观地折叠一组状态的方式,因此在过渡到子状态机时,必须选择要连接到子状态机的哪个状态。
子状态机中有一个名称以 Up 开头的额外状态。
(Up) Base Layer
表示“外部世界”,这是在视图中包含子状态机的状态机。如果添加从子状态机中的状态到 (Up) Base Layer
的过渡,系统将提示你选择要连接到闭包状态机的哪个状态。
4.6、Solo 和 Mute 功能
详情请访问官网 Solo 和 Mute 功能
在复杂状态机中,分别预览状态机某些部分的运行情况是很有用的做法。为此,您可以使用 Mute 和 Solo 功能:.
- Mute 会禁用过渡。
- Solo 仅播放该过渡。
4.7、目标匹配
详情请访问官网 目标匹配
4.8、反向动力学
详情请访问官网 反向动力学
4.9、根运动 - 工作原理
详情请访问官网 根运动 - 工作原理
5、混合树
详情请访问官网 混合树
6、使用混合形状
详情请访问官网 使用混合形状
7、动画术语表
点击访问 动画术语表
7.1、动画剪辑术语
术语 | 定义 |
---|---|
动画剪辑 (Animation Clip) | 可用于动画角色或简单动画的动画数据。这是一种简单的单位动作,例如“空闲”、“行走”或“奔跑”(其中一个具体实例)。 |
动画曲线 (Animation Curves) | 曲线可以附加到动画剪辑,并由游戏中的各种参数控制。 |
Avatar 遮罩 (Avatar Mask) | 为骨架指定要包含或排除哪些身体部位。在动画层和导入器中使用。 |
7.2、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 方向的运动),与旋转相反。 |
7.3、Animator 和 Animator Controller 术语
术语 | 定义 |
---|---|
Animator 组件 (Animator Component) | 作为模型上的组件,其使用动画系统对该模型进行动画化。 该组件引用的 Animator Controller 资源可控制动画。 |
根运动 (Root Motion) | 角色根的运动(无论是由动画本身还是由外部控制)。 |
Animator Controller | Animator Controller 通过具有动画状态机和动画混合树的动画层(由动画参数控制)来控制动画。 同一 Animator Controller 可由具有 Animator 组件的多个模型引用。 |
Animator 窗口 (Animator Window) | 在窗口中可显示和编辑 Animator Controller。 |
动画层 (Animation Layer) | 动画层包含的动画状态机可控制模型或模型某部分的动画。 相应的示例为,你有一个用于行走或跳跃的全身层,还有一个用于上身运动(例如投掷物体或射击)的更高层。 更高层优先于它们控制的身体部位。 |
动画状态机 (Animation State Machine) | 这是一种用于控制动画状态交互情况的图。 每个状态都引用一个动画混合树或单个动画剪辑。 |
动画混合树 (Animation Blend Tree) | 用于根据浮点动画参数在类似动画剪辑之间进行连续混合。 |
动画参数 (Animation Parameters) | 用于脚本与 Animator Controller 之间的通信。 一些参数可在脚本中进行设置并由控制器使用,而其他参数基于动画剪辑中的自定义曲线,可使用脚本 API 对这些参数进行采样。 |
反向动力学 (Inverse Kinematics, IK) | 根据世界中各种物体的位置来控制角色身体部位的能力。 |