【Unity】10.4 类人动画角色的控制
分类:Unity、C#、VS2015
创建日期:2016-05-02
一、简介
导入角色网格和动画及设置 Avatar 之后,就可以准备开始在游戏中使用它们了。以下部分涵盖 Mecanim 提供的、用于控制及排序动画的主要功能。
二、循环动画片段
使用动画的一个常见操作是确保动画正确循环。例如,表示走路循环的动画片段以类似的姿势开始、结束非常重要(如开始时左脚在地面上,结束时右脚在地面上),这样才能确保不会出现脚滑动或奇怪的不稳定动作。Mecanim为解决此问题提供了方便的工具,让动画片段可基于姿势、旋转和位置进行循环。
1、相关属性
(1)Start、End--开始和结束
如果拖动动画片段的起始 (Start) 或结束 (End) 点,你就会看到所有参数的循环 (Looping) 拟合曲线(以能够循环的参数为基础)。如果将起始 (Start)、结束 (End) 标记放在绿色属性曲线的位置,那么就会增大片段正确循环的几率。
(2)loop match--循环匹配
循环匹配指示器(loop match)用于显示所选范围的循环状况。
不是绿色的说明匹配不合适,其结果是动画播放时可能会造成重影(也叫“伪影”)。
(3)Loop Pose--循环姿势
如果循环匹配 (loop match) 指示器全部都变成了绿色,说明所启用的循环姿势 (Loop Pose)正确,这样动画播放时姿势循环就不会出现“伪影”。
2、动画组件(Animator Component)
任何具有 Avatar 的游戏对象 (GameObject) 都具有动画组件(Animaor),该组件是角色与其行为之间的链接。
动画组件引用动画控制器 (Animator Controller),该控制器用于对角色进行行为设置。包括通过脚本控制的状态机 (State Machine)、混合树 (Blend Tree)和事件的设置。
相关属性如下:
- Controller 控制器。附加到此角色的动画器控制器
- Avatar 此角色的Avatar。
- Apply Root Motion 应用根运动。应从动画本身还是从脚本控制角色的位置。
- Animate Physics 对物理进行动画处理。即:动画是否应与物理交互?
- Culling Mode 动画的剔除模式
- Always animate 始终播放动画,不剔除
- Based on Renderers 基于渲染器的动画处理。即:当角色渲染器不可见时,仅对根运动进行动画处理,而身体的其他身体部位都保持静态。
3、动画控制器 (Animator Controller)
可以从 动画器控制器(Animator Controller) 视图【菜单: 窗口 (Window)> 动画器控制器 (Animator Controller)】查看和设置角色行为。
动画控制器 (Animator Controller)可以从 工程视图 (Project View) 【菜单: 创建 (Create) > 画器控制器 (Animator Controller)】进行创建。这会在磁盘上创建.controller资源 ,该资源文件在工程浏览器 (Project Browser)中用下面的图标显示:
进行状态机设置之后,可以在层次结构视图 (Hierarchy View) 中将控制器置于具有 Avatar 的任何角色的动画组件上。
动画控制器窗口 (Animator Controller Window)包括:
(1)动画层小组件 (Animation Layer Widget) (左上角,请参阅动画层?)
(2)事件参数小组件 (Event Parameters Widget) (左下角,请参阅动画参数?)
(3)状态机本身的可视化。
注意,动画器控制器窗口 (Animator Controller Window) 会始终显示最近选择的 .controller 资源中的状态机(与当前加载的场景无关)。
三、动画状态机
角色拥有几个对应于其在游戏中可以执行的不同动作的不同动画,这一点非常常见。例如,它可能在空闲时轻轻呼吸或摇摆,接受命令时走路,从平台坠落时恐慌地举起双臂。回放这些动画时进行控制可能是非常复杂的脚本任务。Mecanim 借用一个称为状态机的计算机科学概念来简化角色动画的控制和排序。
1、状态机基本原理
基本思想是角色在任何给定时间忙于一些特殊的动作。可用的动作取决于游戏类型,但典型动作包括空闲、走路、跑步、跳跃等。这些动作称为状态,在场景中,角色处于走路、空闲等“状态”。通常,角色要进入另一种状况会受到限制,而不是可以直接从任何状态转换成任何其他状态。例如,跑跳仅在角色已经在跑步时而非停滞不前时实现,所以永远无法直接从空闲状态转换成跑跳状态。角色可从当前状态进入下一个状态的选型称为状态转换。总之,状态集、转换集和记住当前状态的变量形成了状态机。
状态机的状态和转换可用一个图解表示,其中节点代表状态,弧(节点之间的箭头)代表转换。您可以把当前状态看作一个标记或置于一个节点上的突出显示,然后只需沿着一条箭头跳转到另一个节点。
动画状态机的价值在于可以用相对较少的编码即可轻松设计和更新。每个状态有一个与之相关的动作 (Motion),并在机器处于该状态时播放。这样就使动画器或设计器能够定义角色动作和动画的可能顺序,无需担心代码如何工作。
2、Mecanim 状态机
Mecanim 的动画状态机 (Animation State Machines) 提供一种方式来概览与特殊角色相关的全部动画片段,让游戏中的各种事件(例如用户输入)触发不同的动画。
可从动画器控制器窗口设置动画状态机 (Animation State Machines),如下所示:
状态机 (State Machines) 包含状态 (States)、转换 (Transitions) 和事件 (Events),较小的子状态机 (Sub-State Machines) 可在较大的机器中用作组件。
3、动画状态 (Animation State)
动画状态 (Animation State) 是 动画状态机 (Animation State Machine)的基本构造块。每个状态包含将在角色处于该状态时播放的单独动画序列(或混合树 (blend tree))。游戏中的事件触发状态转换时,角色会保留为新状态,该状态的动画序列随后会接管播放。
相关属性如下:
速度 (Speed) 动画的默认速度
运动 (Motion) 分配给此状态的动画片段
脚 IK (Foot IK) 是否应对此状态考虑“脚 IK”(Foot IK)
转换 (Transitions) 源自此状态的转换的列表
默认状态(以棕色显示)是第一次激活时计算机所处的状态。必要时,可以通过右键单击另一个状态并从上下文菜单中选择设为默认 (Set As Default) 来更改默认状态。每个转换上的独奏 (solo) 和静音 (mute) 复选框用于控制动画预览行为 — 有关更多详细信息,请参阅此页面。
可以通过在动画器控制器窗口 (Animator Controller Window) 中右键单击空白空间并从上下文菜单中选择 创建状态 (Create State)->空 (Empty) ,来添加新状态。或者,可以将一个动画拖动到动画器控制器窗口 (Animator Controller Window) 中以创建包含该动画的状态。(请注意,只能将 Mecanim 动画拖动到控制器中 - 非 Mecanim 动画会被拒绝。)状态还可以包含混合树 (Blend Tree)。
任意状态 (Any State)
任意状态 (Any State) 是始终存在的特殊状态。该状态针对您要转变为特定状态(无论您当前处于何状态)的情况而存在。这是将相同向外转换添加到机器中所有状态的快速方法。请注意,任意状态 (Any State) 的特殊含义意味着它不能是转换的结束点(即,跳转到“任意状态”不能用作挑选下一次进入的随机状态的方式)。
4、动画转换 (Animation Transition)
动画转换 (Animation Transition) 定义从一个 动画状态 (Animation State) 在任何给定时间都只能有一个转换处于活动状态。
相关属性:
原子 (Atomic) 此转换是否为原子转换?(无法中断)
条件 (Conditions) 在此处决定触发转换的时间时间。.
还可以使用退出时间Exit Time,而不使用参数,并指定表示源状态的规范化时间的数字(例如,0.95 表示在播放了 95% 的源片段内容时触发转换)。
参数值(如果需要):可以通过拖动重叠的开始值和结束值,来调整两个动画片段之间的转换。
四、混合树 (Blend Tree)
游戏动画中的一个常见任务是在两个或更多相似运动之间混合。最佳的已知示例可能是根据角色速度混合行走和奔跑动画。另一个示例是角色在奔跑过程中转弯时向左或向右倾斜。
重要的是区分转换 (Transition) 与混合树 (Blend Tree)。虽然两者都用于创建平滑动画,但是它们用于不同类型的情况。
基本概念:
转换 (Transition):用于在给定时间量内从一个动画状态 (Animation State) 平滑转换为另一个状态。转换指定为动画状态机 (Animation State Machine) 的一部分。如果转换迅速,则通常可从一个运动很好地转换为完全不同的运动。
混合树 (Blend Tree):用于允许通过按不同程度组合所有动画的各个部分来平滑混合多个动画。各个运动参与形成最终效果的量使用混合参数进行控制,该参数只是与动画器控制器 (Animator Controller) 关联的数值动画参数之一。要使混合运动有意义,混合的运动必须具有相似性质和时间。混合树 (Blend Tree) 是动画器控制器 (Animator Controller) 中的特殊状态类型。
相似运动示例可以是各种行走和奔跑动画。要使混合工作良好,片段中的移动必须在相同的规范化时间点发生。例如,行走和奔跑动画可以对齐,以便脚与地面接触的时刻在相同的规范化时间点发生(例如,左脚在 0.0 踏地,而右脚在 0.5 踏地)。因为使用规范化时间,所以片段是否具有不同长度无关紧要。
要开始使用新混合树 (Blend Tree),需要:
右键单击动动画器控制器窗口 (Animator Controller Window)上的空白空间
从出现的上下文菜单中选择 创建状态 (Create State) > 从新混合树 (From New Blend Tree)。
双击混合树 (Blend Tree) 以进入混合树图 (Blend Tree Graph)。
动画器控制器窗口 (Animator Controller Window) 现在显示整个混合树 (Blend Tree) 的图形,而检视器 (Inspector) 显示当前选择的节点及其直接子级。
动画器窗口 (Animator Window) 显示整个 混合树 (Blend Tree) 的图形。左侧是仅包含根混合节点 (Blend Node) 的混合树 (Blend Tree)。右侧是包含根混合节点 (Blend Node) 以及以三个动画片段 (Animation Clip) 作为子节点的混合树 (Blend Tree)。
这会为参数值变化时的动画组合方式提供图形可视化(在拖动滑块时,源自树根的箭头会改变其底纹以显示主要动画片段)。
可以在混合树 (Blend Tree) 图中选择任何节点以在检视器 (Inspector) 中检视它。如果所选节点是动画片段 (Animation Clip),则会显示该动画片段 (Animation Clip) 的检视器 (Inspector)。如果动画是从模型导入,则设置是只读的。如果节点是混合节点 (Blend Node),则会显示混合节点 (Blend Node) 的检视器 (Inspector)。
下图是运动前已添加的检视器 (Inspector) 中显示的混合节点 (Blend Node)。
混合类型”(Blend Type) 下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。可以在以下页面上了解有关不同混合类型和其他混合树 (Blend Tree) 选项的更多信息。
1、一维混合 (1D Blending)
混合节点 (Blend Node) 的检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。一维混合 (1D Blending) 根据单个参数混合子运动。
设置混合类型 (Blend Type) 之后,需要执行的第一个操作是选择将控制此混合树 (Blend Tree) 的动画参数 (Animation Parameter)。在此示例中,该参数为方向 (direction),它在 -1.0(左)与 +1.0(右), 其中 0.0 表示笔直运行而不倾斜。
随后可以通过单击 + ->添加运动域 (Add Motion Field) 将动画片段 (Animation Clip) 添加到混合树中,从而添加各个动画。完成后,它应类似于下面这样:
2、二维混合 (2D Blending)
混合节点 (Blend Node)的检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。二维混合 (2D Blending) 类型根据两个参数混合子运动。
3、其他混合树 (Blend Tree) 选项
以下选项对一维和二维混合通用。
时间尺度 (Time Scale)
可以使用动画速度数字字段(顶部具有时钟图标的列)改变动画片段 (Animation Clip) 的“自然”速度,从而可以通过使用值 2.0 作为速度,使行走速度是以前的两倍。调整时间尺度 (Adjust Time Scale) > 均匀速度 (Homogeneous Speed) 按钮可重新调整片段的速度,以便它们符合参数的最小值和最大值,但是保持最初具有的相同相对速度。
请注意,仅当所有运动都是动画片段 (Animation Clip) 而不是子混合树 (Blend Tree) 时,调整时间尺度 (Adjust Time Scale) 下拉菜单才可用。
镜像 (Mirroring)
可以通过启用最右侧的镜像开关来镜像运动列表中的任何类人动画片段 (Animation Clip)。此功能使您可以采用原始形式和镜像版本使用相同动画,而无需两次使用内存和空间。