Unity 动画

unity练习开始项目: 动画

1. 动画系统概述

Unity 有一个丰富而复杂的动画系统(有时称为“Mecanim”)。该系统具有以下功能:

  • 为 Unity 的所有元素(包括对象、角色和属性)提供简单工作流程和动画设置。
  • 支持导入的动画剪辑以及 Unity 内创建的动画
  • 人形动画重定向 - 能够将动画从一个角色模型应用到另一角色模型。
  • 对齐动画剪辑的简化工作流程。
  • 方便预览动画剪辑以及它们之间的过渡和交互。因此,动画师与工程师之间的工作更加独立,使动画师能够在挂入游戏代码之前为动画构建原型并进行预览。
  • 提供可视化编程工具来管理动画之间的复杂交互
  • 以不同逻辑对不同身体部位进行动画化。
  • 分层和遮罩功能。

1.1 动画工作流程

Unity 的动画系统基于动画剪辑 (Animation Clip)的概念;动画剪辑包含某些对象应如何随时间改变其位置、旋转或其他属性的相关信息。每个剪辑可视为单个线性录制。来自外部的动画剪辑由美术师或动画师使用第三方工具(例如 Autodesk® 3ds Max® 或 Autodesk® Maya®)创建而成,或者来自动作捕捉工作室或其他来源。

然后,动画剪辑将编入称为 Animator Controller 的一个类似于流程图的结构化系统中。Animator Controller 充当“状态机”,负责跟踪当前应该播放哪个剪辑以及动画应该何时改变或混合在一起。一个非常简单的 Animator Controller 可能只包含一个或两个剪辑,例如,使用此剪辑来控制能量块旋转和弹跳,或设置正确时间开门和关门的动画。一个更高级的 Animator Controller 可包含用于主角所有动作的几十段人形动画,并可能同时在多个剪辑之间进行混合,从而当玩家在场景中移动时提供流畅的动作。

Unity 的动画系统还具有用于处理人形角色(Avatar)的许多特殊功能。这些功能可让人形动画从任何来源(例如:动作捕捉、Asset Store 或某个其他第三方动画库)重定向到您的角色模型中,并可调整肌肉定义。这些特殊功能由 Unity 的替身系统启用;在此系统中,人形角色会被映射到一种通用的内部格式中。

所有这些部分(动画剪辑、Animator Controller 和 Avatar)都通过 Animator 组件一起附加到某个游戏对象上。该组件引用了Animator Controller,并(在必需时)引用此模型的 Avatar。Animator Controller又进一步包含所使用的动画剪辑的引用。

上图显示了以下内容:

  1. 动画剪辑是从外部来源导入的或在 Unity 内创建的。在此示例中,它们是导入的动作捕捉人形动画。
  2. 动画剪辑显示并排列在Animator Controller中。因此,在 Animator 窗口中会显示Animator Controller的视图。状态(可表示动画或嵌套的子状态机)显示为通过线条连接的节点。此Animator Controller作为资源存在于 Project 窗口中。
  3. 骨架角色模型(在本示例中为宇航员“Astrella”)具有映射到 Unity 常见替身格式骨骼的特定配置。此映射作为导入的角色模型的一部分存储为 Avatar 资源,并且在 Project 窗口中显示(如图所示)。
  4. 对角色模型进行动画化时,角色模型会附带一个Animator组件。在上图所示的 Inspector 视图中,您可以看到一个Animator组件,该组件已被分配了Animator Controller和替身。Animator将这些一起用于对模型的动画化过程。仅在对人形角色进行动画化时,才需要引用 Avatar。对于其他动画类型,只需Animator Controller。

1.2 Unity 动画师职责

  • 需要熟悉在编辑器中导入和配置动画,
  • 需要知道如何设置动画控制器,这些控制器是确定一个动画何时过渡到另一个动画的组件。

深入了解 Unity 中的所有动画组件会很有帮助,并且了解一些非常基本的脚本知识对他们来说尤其有用。动画师不太可能需要编写脚本来运行动画,但通常会实现团队中的程序员为其编写的脚本。

2. 动画剪辑 Animation Clip

在 Unity 中,单个动画存储在一个名为Animation Clip的资源中。它们与创建剪辑时选择的对象相关联,并存储用于创建特定动画的所有 数据 。动画剪辑存储中的数据信息是随时间更改,可以是形变,如:Transform 中的位置、大小、旋转;也可以是所关联对象的外观着色变化(Shading),比如颜色、发光度等等。动画剪辑可以是任意时间长度,单个游戏对象可以有多个与之关联的动画剪辑。

Unity 中,可以自建较为简单的动画剪辑,也支持导入外部动画。

2.1 外部动画

从外部源导入的动画剪辑可能包括:

  • 在动作捕捉工作室中捕捉的人形动画
  • 美术师在外部 3D 应用程序(如 Autodesk® 3ds Max® 或 Autodesk® Maya®)中从头开始创建的动画
  • 来自第三方库(例如 Unity 的 Asset Store)的动画集
  • 从导入的单个时间轴剪切的多个剪辑

1. 导入动画

在 Unity 中使用任何动画之前,必须先将其导入项目。Unity 可导入本机 Autodesk® Maya®(.mb 或 .ma)、Autodesk® 3ds Max® (.max) 和 Blender™ (.blend),以及通用 FBX 文件(这些文件可从大多数动画包中导出)。

2. 查看动画数据

在 Animation 窗口中查看导入的动画剪辑的关键帧和曲线。有时,如果这些导入的剪辑存在带有大量关键帧的很多骨骼,信息量可能非常复杂。例如,下图是 Animation 窗口中的人形奔跑动画的情况:

2.2 自建简单动画

在 Unity 的 Animation 窗口中还可以创建和编辑动画剪辑。这些剪辑可针对以下各项设置动画:

  • 游戏对象的位置、旋转和缩放
  • 组件属性,例如材质颜色、光照强度、声音音量
  • 自定义脚本中的属性,包括浮点、整数、枚举、矢量和布尔值变量
  • 自定义脚本中调用函数的时机

1. 打开 Animation 窗口:顶部菜单:__Window > Animation > Animation ,Ctrl + 6 是快捷键

2. 在 Hierarchy 中选择要创建动画的游戏对象,在 Animation 窗口时间轴区域的中心位置点击“Create”按钮,创建动画剪辑

3. 在打开的窗口中,将动画剪辑保存在 Assets 文件夹内,最好新建一个专门用来存放动画剪辑的 Animations 文件夹,分类保存素材

保存这个新的空动画剪辑时,Unity 会执行以下操作:

  • 创建新的 Animator Controller 资源
  • 将新剪辑以默认状态添加到 Animator Controller 中
  • 将 Animator 组件添加到要应用动画的游戏对象
  • 为 Animator 组件分配新的 Animator Controller

4. 编辑动画剪辑,添加关键帧,添加变化,形成完整动画片段

5. 如果需要,可以为同一个游戏对象添加多个动画剪辑

6. 同一对象的不同的动画剪辑可以放入一个动画控制器中,进行管理,满足不同条件是进行切换

在下面项目练习 5.1 中将会实践上述动画操作!

3. Animator Controller

Animator Controller 安排和维护一组动画剪辑和相关的动画过渡。 对于一个角色或对象。在大多数情况下,有多个动画并在某些游戏条件发生时在它们之间切换是正常的。例如,可以从步行切换动画剪辑,每当按下空格键时跳转到动画剪辑。但是,即使只有一个动画剪辑,仍然需要将其放入 Animator Controller 中才能在游戏对象

Animator Controller 引用了其中使用的动画剪辑,并使用状态机,它可以被认为是动画剪辑和过渡的流程图,或者是在 Unity 中用可视化编程语言编写的简单程序。

当开始使用动画窗口为游戏对象设置动画时,或者当将动画剪辑附加到游戏对象时,Unity 会自动创建一个动画控制器。如果要手动创建 Animator Controller,请右键单击 Project 窗口,然后单击Create > Animator Controller。

3.1 Animator Controller 窗口

在 Animator 窗口中可创建、查看和修改 Animator Controller 资源。Animator 窗口有两个主要部分:主要网格化布局区域以及左侧 Layers 和 Parameters 面板。

可以在栅格上单击鼠标右键以创建新的状态节点。使用鼠标中键或Alt/Option拖动来平移视图。单击以选择状态节点进行编辑,然后单击并拖动状态节点以重新排列状态机的布局

左侧窗格可以在“参数”视图和“层”视图之间切换。参数视图允许您创建、查看和编辑“动画制作者控制器参数”。这些是您定义的变量,用作状态机的输入。要添加参数,请单击加号图标,然后从弹出菜单中选择参数类型。要删除参数,请在列表中选择该参数,然后按delete键。

左侧面板切换到 Layers 视图时,可以在 Animator Controller 中创建、查看和编辑层。因此,可在单个动画控制器中同时运行多个动画层,每个动画层由一个单独状态机控制。此情况的常见用途是在控制角色一般运动动画的基础层之上设置一个单独层来播放上身动画。

3.2 Animation State 动画状态 和 Animation State Machine 动画状态机

3.2.1 状态机基础

状态机的基本思想是使角色在某一给定时刻进行一个特定的动作。动作类型可因游戏类型的不同而不同,常用的动作包括空闲、行走、跑步、跳跃等,其中每一个动作被称为__一种状态。在某种意义上,角色处于行走、空闲或者其它的“状态”中。一般来说,角色从一个状态立即切换到另一个状态是需要一定的限制条件的。比如角色只能从跑步状态切换到跑跳状态,而不能直接由静止状态切换到跑跳状态。角色从当前状态进入下一个状态的选项被称为状态过渡条件。状态集合、状态过渡条件以及记录当前状态的变量放在一起,形成了一个__状态机。

状态及其过渡条件可以通过图形来表达,其中的节点表示状态,而弧线(节点间的箭头)表示状态过渡。您可以将当前状态视为放置在节点之一上的标记或亮点,然后只能沿箭头之一跳转到另一个节点。

3.2.2 动画状态机

Unity的动画状态机提供了一种纵览角色所有动画剪辑的方法,并且允许通过游戏中的各种事件(如用户输入)来触发不同的动画效果。动画状态机可以通过 Animator Controller 窗口来创建,这些状态机如下所示:

动画状态机包括__动画状态、动画过渡__和__动画事件__,而复杂的状态机还可以含有简单的子状态机。

1. 动画状态 Animation Stat 是动画状态机 Animation State Machine 的基本构建模块, 当角色处于一个状态下时,每个状态都包含一个动画序列(或混合树)在播放。下图中是动画状态属性面板:

  • Motion (动作、运动): 当前状态下挂接的动画片段(Animation clip)或 混合树(blend tree)
  • Speed (速度): 默认为1 ,当前 Motion 的播放速度,可以设置为负数,比如 -1 就是倒放 。另外,启用参数以使用脚本中的自定义值修改速度。例如,您可以将速度与自定义值相乘以减慢或加快播放速度。
  • Motion Time(运动时间):用于播放此状态的动作的时间。启用参数以使用脚本中的自定义值控制运动时间。
  • Mirror (镜像):此属性仅适用于具有人形动画. 启用以镜像此状态的动画。启用参数以启用或禁用脚本的镜像。
  • Cycle Offset (周期偏移):添加到运动状态时间的偏移量。此偏移不影响运动时间。启用参数以指定脚本的循环偏移。
  • Foot IK (足部反向动力学):此属性仅适用于具有类人动画的状态。启用此状态的 Foot IK。
  • Write Defaults(写入默认值):AnimatorStates 是否为不通过其运动设置动画的属性写入默认值。
  • Transitions(过渡):源自此状态的转换列表。

状态机行为是一类特殊脚本。与将常规 Unity 脚本 (MonoBehaviour) 附加到单个游戏对象类似,可以将 StateMachineBehaviour 脚本附加到状态机中的单个状态。因此可编写一些将在状态机进入、退出或保持在特定状态时执行的代码。这意味着您不必编写自己的逻辑来测试和检测状态的变化。

此功能的一些用例可能包括:

  • 在进入或退出状态时播放声音
  • 仅在相应状态下执行某些测试(例如,地面检测)
  • 激活和控制与特定状态相关的特效

创建状态机行为并将其添加到状态的方式与创建脚本并将其添加到游戏对象的方式非常类似。在状态机中选择状态,然后在检视面板中使用“Add Behaviour”按钮来选择现有的 StateMachineBehaviour 或创建新行为。

2. 状态机过渡可帮助您简化大型或复杂的状态机。允许对状态机逻辑进行更高级的抽象化。

Animator 窗口中的每个视图都有一个进入 (Entry) 和退出 (Exit) 节点。在状态机过渡期间使用这些节点。过渡到状态机时使用进入节点。进入节点将接受评估,并根据设置的条件分支到目标状态。通过此方式,进入节点可以通过在状态机启动时评估参数的状态来控制状态机的初始状态。

因为状态机始终具有默认状态,所以始终会有从进入节点分支到默认状态的默认过渡。

  • 过度属性

  • Has Exit Time :退出时间是一种不依赖于参数的特殊转换。相反,它依赖于状态的标准化时间。检查以使转换在Exit Time中指定的特定时间发生。

  • Settings: 包含以下详细过渡设置的折叠式菜单。

  • Exit Time: 如果选中Has Exit Time,则此值表示转换可以生效的确切时间。
    这以标准化时间表示(例如,退出时间为 0.75 表示在播放了 75% 动画的第一帧上,退出时间条件为真)。在下一帧,条件为假。 对于循环动画,每个循环都会评估退出时间小于 1 的过渡,因此您可以使用它来为每个循环的动画中的适当时间安排过渡。

    具有退出时间的转换大于 1 只计算一次,因此它们可用于在固定数量的循环后在特定时间退出。例如,退出时间为 3.5 的转换在三个半循环后评估一次。

  • Fixed Duration 固定时间:
    如果选中Fixed Duration框,则转换时间以秒为单位进行解释。如果未选中“固定持续时间”框,则转换时间被解释为源状态标准化时间的一小部分。

  • Transition Duration 过渡时间:
    转换的持续时间,以标准化时间或秒为单位,取决于固定持续时间模式,相对于当前状态的持续时间。

    这在过渡图中可视为两个蓝色标记之间的部分。

  • Transition Offset 过渡偏移:
    在转换到的目标状态下开始播放的时间偏移量。
    例如,值 0.5 表示目标状态在其时间线的 50% 处开始播放。

  • Interruption Source (中断源):
    使用它来控制可能中断此转换的情况。
    从概念上讲,中断顺序的工作方式就像转换排队,然后解析从插入的第一个转换到最后一个转换的有效转换。

    • None : 不要再添加任何过渡。
    • current State:从当前状态排队转换。
    • Next State :排队从下一个状态的转换。
    • Current State then Next State:将当前状态的转换排队,然后将下一个状态的转换排队。
    • Next State the Current State:将下一个状态的转换排队,然后将当前状态的转换排队。
  • Ordered Interruption (有序中断):
    确定当前转换是否可以被其他转换打断,与它们的顺序无关

    • Checked: 已找到有效的转换或当前转换。
    • Unchecked: 已找到有效的转换。
  • Conditions (条件):
    转换可以有一个条件、多个条件或根本没有条件。如果您的过渡没有条件,Unity 编辑器仅考虑Exit Time,并且在达到退出时间时发生过渡。如果您的转换有一个或多个条件,则必须在触发转换之前满足所有条件。

    条件包括:

    • 事件参数(条件中考虑的值)。
    • 条件谓词(如果需要,例如,浮点数的“小于”或“大于”)。
    • 参数值(如果需要)。

    如果您为过渡选择了Has Exit Time并且有一个或多个条件,请注意 Unity 编辑器会在退出时间。这使您可以确保在动画的某个部分发生过渡。

3.2.3 子状态机

Mecanim 允许您一组状态折叠为状态机图中的单个指定项。这些折叠的状态组称为__子状态机__。

若要创建子状态机,可右键单击 Animator Controller 窗口中的空白空间,并从上下文菜单中选择 Create Sub-State Machine。子状态机在编辑器中用细长六边形表示以区别于正常状态:

双击六边形时将清理编辑器,让您编辑子状态机,好像它本身就是一个完全独立的状态机。窗口顶栏会显示“示踪导航路径”以指示当前正在编辑的子状态机(注意,可在其他子状态机内创建子状态机,以此类推)。单击跟踪路径中的某项将使编辑器聚焦于该特定子状态机。

示踪导航路径

“示踪导航路径”

子状态机只是一种在编辑器中直观地折叠一组状态的方式,因此在过渡到子状态机时,必须选择要连接到子状态机的哪个状态。

子状态机中有一个名称以 Up 开头的额外状态,Up 状态表示“外部世界”,也就是上一层

Up 状态表示“外部世界”,这是在视图中包含子状态机的状态机。如果添加从子状态机中的状态到 Up 状态的过渡,系统将提示您选择要连接到闭包状态机的哪个状态。

连接到闭包状态机中的状态

连接到闭包状态机中的状态

3.3 Blend Tree 混合树状态过渡

Blend Tree 混合树可以平滑混合多个不同的动画片段;通过 Animator Controller 中的参数可以控制混合树中动画片段(不同状态)间的转换。

区分过渡与混合树十分重要。虽然两者都用于创建平滑动画,但它们用于不同种类的情况。

  • __过渡__用于在给定时间内从一个动画状态平滑过渡到另一动画状态。过渡作为动画状态机的一部分指定。如果过渡很快,从一个运动到完全不同运动的过渡通常没有问题。
  • __混合树__允许通过不同程度合并多个动画来使动画平滑混合。每个运动对最终效果的影响由一个_混合参数_控制,该参数只是与 Animator Controller 相关联的数字动画参数之一。为了使混合后的运动合理,要混合的运动必须具有相似的性质和时机。混合树是动画状态机中的一种特殊状态类型。

例如,类似运动可能是各种行走和奔跑动画。为了使混合取得良好效果,剪辑中的动作必须在标准化时间内的相同点进行。例如,可将行走和奔跑动画对齐,使得脚与地面的接触时刻发生在标准化时间内的相同点(例如,左脚接触点为 0.0,右脚接触点为 0.5)。由于使用标准化时间,因此剪辑长度不同并不要紧。

要将动画剪辑添加到混合树,可选择该混合树,然后单击 Inspector 的 Motion 字段内的加号图标。添加任何运动之前在 Inspector 中显示的混合节点。加号图标用于添加动画剪辑或子混合树。

添加任何运动之前在 Inspector 中显示的混合节点。加号图标用于添加动画剪辑或子混合树。

或者,也可通过右键单击混合树并从上下文菜单进行选择来添加动画剪辑或子混合节点:右键单击混合树节点时的上下文菜单。

右键单击混合树节点时的上下文菜单。

使用动画剪辑和输入参数来设置混合树时,Inspector 窗口通过图形显示动画如何随着参数值变化而进行组合(拖动滑动条时,树根中的箭头会改变其着色以显示其控制的动画剪辑)。

3.3.1 分类

  • 1D 混合:根据单个参数来混合子状态
  • 2D 混合:根据两个参数来混合子状态
    • 2D Simple Directional: 在运动表示不同方向(例如“向前走”、“向后退”、“向左走”和“向右走”或者“向上瞄准”、“向下瞄准”、“向左瞄准”和“向右瞄准”)时使用。根据需要可以包括位置 (0, 0) 处的单个运动,例如“空闲”或“瞄准”。在 Simple Directional 类型中,在同一方向上_不_应该有多个运动,例如“向前走”和“向前跑”
    • 2D Freeform Directional:运动表示不同方向时,也使用此混合类型,但是您可以在同一方向上有多个运动,例如“向前走”和“向前跑”。在 Freeform Directional 类型中,运动集应始终包括位置 (0, 0) 处的单个运动,例如“空闲”。
    • 2D Freeform Cartesian:最好在运动不表示不同方向时使用。凭借 Freeform Cartesian,X 参数和 Y 参数可以表示不同概念,例如角速度和线速度。一个示例是诸如“向前走不转弯”、“向前跑不转弯”、“向前走右转”、“向前跑右转”之类的运动。
  • 直接混合 Direct:直接控制所有子状态机,为每个动作分配一个相应参数以直接控制其在树中的混合权重

3.3.2 核心参数

  • 混合图像

参数在最小值和最大值之间变化时,混合图显示每个子运动的影响。每个运动都显示为一个蓝色小金字塔(第一个和最后一个仅显示一半),如果您在其中一个上单击并按住鼠标左键,相应运动将在下面的运动列表中突出显示。每个金字塔的顶峰定义运动具有最大影响的参数值,表示其动画权重为 1,而其他动画的权重为 0。这也称为运动的__阈值__。

红色竖条表示__参数 (Parameter)__ 的值。如果在 Inspector 底部的 Preview 中按 Play 并左右拖动图中的红色条,可以看到参数值如何控制不同运动的混合。

  • 阈值 Thresholds

阈值就是在 blendTree 中参数的范围极限值。
可以通过单击图中的对应蓝色金字塔并将其向左或向右拖动来更改运动的阈值。如果未启用“Automate Thresholds”开关,还可通过在 Threshold 列的数字字段中输入数字来编辑运动列表中某个运动的阈值。
运动列表下方是 Automate Thresholds 复选框。启用此复选框将在参数范围内均匀分布运动的阈值。例如,如果有五个剪辑且参数范围为 –90 到 +90,则阈值将按顺序设置为 –90、–45、0、+45 和 +90。
Compute Thresholds 计算阈值 :
下拉选单将根据您选择的数据设置阈值;这些数据是从动画剪辑的根运动中获得的。可供选择的数据是速度 (Speed)、速度 (Velocity) x、y 或 z 以及以角度或弧度表示的角速度 (Angular Speed)。如果您的__参数__对应于这些属性之一,则可使用 Compute Thresholds 下拉选单来计算阈值。

  • 时间尺度 Time Scale

您可以使用动画速度数字字段(带有时钟图标的列)更改动画剪辑的“自然”速度。例如,您可以通过指定值 2.0 将步行剪辑的速度加倍。Adjust Time Scale > Homogeneous Speed按钮重新调整剪辑的速度,使它们与所选参数的最小值和最大值相对应,但保持与最初的相对速度相同。

  • 镜像 Mirror

启用镜像复选框以镜像任何人形动画。剪辑在动作列表中。镜像使用与其未镜像的原始动画相同的动画,而不会使内存和空间增加一倍。
但是,在混合树中镜像动画不会创建完全对称的动画。Unity 会自动添加偏移量,以确保跑步循环、步行循环和脚步等动画与其他动画剪辑和混合树正确混合。例如,如果您的混合树中有一个人形机器人向左运行,并且您启用 Mirror 以将人形机器人切换为向右运行,则脚循环需要匹配,以便左脚同时接触地面。这可确保镜像的混合树与周围的剪辑和其他尚未镜像的混合树正确混合。

  • 2D 混合图

运动以蓝点显示。未分配动画剪辑或混合树的运动对混合没有影响,并显示为灰点。您可以通过单击图中的运动点来选择该运动。选择运动后,该运动对混合空间中每个点的影响便会可视化为蓝色区域。此区域位于该运动的位置正下方时最强,此情况下运动具有完全影响,意味着其动画权重为 1 而其他动画的权重为 0。逐渐远离该位置后,此运动的影响将减弱,而其他运动的影响将增强。

红点表示两个__参数__的值。如果在 Inspector 底部的 Preview 中按 Play 并在图中四处拖动红点,可看到参数值如何控制不同运动的混合。在图中,您还可以看到每个运动的影响(表示为围绕每个运动的圆圈)。您将看到,如果将红点移动到表示运动的其中一个蓝点上,则该运动的圆圈将获得其最大半径,而其他所有运动的圆圈将缩小到看不见。在几个运动之间的位置,附近的多个运动将对混合产生影响。如果选择其中一个运动以查看该运动的蓝色影响区域,您可以看到在四处移动红点时,运动的圆形大小与影响区域在不同位置的强度完全对应。
未选择任何运动时,该图显示所有影响区域的混合,在单个运动主导的位置,颜色会更蓝,而在许多运动对混合有影响的位置,蓝色会更淡。

4. Avatar

Unity 使用Avatar系统来识别布局中的特定动画模型是否为人形,以及模型的哪些部分对应于腿、手臂、头和躯干。

由于不同人形角色之间的骨骼结构相似,因此可以将动画从一个人形角色映射到另一个人形角色,从而允许重定向和反向运动学 (IK)。

Unity 的 Avatar 结构如下:

4.1 导入带有人形动画的模型

动画系统使用两种类型的模型:

  • 人形 (Humanoid) 模型是一种非常特别的结构,包含至少 15 种骨骼,这些骨骼的组织方式与实际人体骨架大致相符。本页面包含有关导入此类模型的指南。
  • 所有其他模型为通用模型。这可能是从茶壶到龙的任何东西。有关导入此类模型的更多信息,请参阅导入带有非人形(通用)动画的模型。

当 Unity 导入包含人形骨架和动画的模型文件时,需要将模型的骨骼结构与其动画进行协调。为了实现这一点,系统会将文件中的每个骨骼映射到人形 Avatar,这样才能正确播放动画。因此,在将模型文件导入 Unity 之前,仔细准备该文件非常重要。

  1. 定义骨架类型并创建 Avatar。
  2. 纠正或验证 Avatar 的映射。
  3. 完成骨骼映射后,可选择单击 Muscles & Settings 选项卡来调整 Avatar 的肌肉配置。
  4. 可以选择将骨架骨骼到 Avatar 的映射保存为人体模板 (.ht) 文件。
  5. 可以选择通过定义 Avatar 遮罩来限制在某些骨骼上导入的动画。
  6. 从 Animation 选项卡中,启用 Import Animation 选项,然后设置其他特定于资源的属性。
  7. 如果文件包含多个动画或动作,可将特定动作范围定义为动画剪辑。
  8. 对于文件中定义的每个动画剪辑,可以:
  • 更改姿势和根变换
  • 优化循环
  • 对人形骨架两侧的动画进行镜像 (Mirror)。
  • 向剪辑添加曲线以便动画化其他项的时序
  • 向剪辑添加事件以便在动画期间触发某些动作
  • 丢弃动画的一部分(类似于使用运行时 Avatar 遮罩,但却是在导入时执行的)
  • 选择其他根运动节点来驱动动作
  • 阅读 Unity 提供的有关导入剪辑的任何消息
  • 观看动画剪辑的预览

要保存更改,请单击 Import Settings 窗口底部的 Apply 按钮,也可单击 Revert 放弃所做的更改。

4.2 重定向人形动画

Mecanim 的最强大功能之一是重定向人形动画。这意味着您可以相对轻松地将同一组动画应用于各种角色模型。重定向只适用于已配置了 Avatar 的人形模型,因为这可以让我们在模型的骨骼结构之间建立对应关系。

建议的层级视图结构
使用 Mecanim 动画时,您可以期望场景包含以下元素:

  • 已导入的具有 Avatar 的角色模型。
  • 引用 Animator Controller 资源的 Animator 组件。
  • 从 Animator Controller 引用的一组动画剪辑。
  • 角色的脚本。
  • 角色相关组件,例如角色控制器。

项目还应包含具备有效 Avatar 的另一个角色模型。

建议的设置是:

  • 在层级视图中,创建包含角色相关组件的游戏对象

  • 将模型作为游戏对象的子代与 Animator 组件放在一起

  • 确保引用 Animator 的脚本正在寻找子代(而不是根)中的 Animator;使用 GetComponentInChildren<Animator>() 而不是 GetComponent<Animator>()。

然后,为了在另一个模型上复用相同动画,您需要:

  • 禁用原始模型
  • 将所需模型作为游戏对象的另一子代拖入

  • 确保新模型的 Animator Controller 属性正在引用同一控制器资源

  • 调整顶级游戏对象上的角色控制器、变换和其他属性以确保动画与新模型顺利融合。
  • 任务完成!

5. 项目练习

先在本文第一行点击下载初始的unity 动画项目!

Get started with animation - Unity Learn

5.1 创建简单动画

1. 从 Unity Hub 打开项目。
2. 在Unity 编辑器的项目窗口中,找到Scenes 文件夹,然后打开场景TutorialScene_Animation_Outdoor
3. 导航至“Window”下拉列表并转至“Animation” > “Animation”,打开Animation编辑器, 将“Animation”编辑器拖动到“Project”窗口旁边。

5. 选择场景中的红球,在Animation编辑器的主工作区域出现了“Create”按键,如图所示:

6. 设置Ball_Pulse动画:单击“Create”按键,Unity 将提示选择动画的保存位置,将动画命名为Ball_Pulse,然后将其保存在Animations文件夹中

7. 当保存完新的动画剪辑时,动画窗口的外观会发生变化。窗口左侧现在有一个“Add Property”按键,可以在其中添加和查看要设置动画的属性。该按键正上方的下拉菜单中是当前动画剪辑的名称。如果您选择在同一游戏对象上有多个动画,则可以从此菜单中选择您想要查看的动画。

8. 单击“Add Property”按键,然后选择“Transform”旁边的下拉列表以显示“Scale”。选择 "+" 按钮将其添加到动画中。

四个菱形图标将出现在时间线的开头和结尾处,两个为一组。这些图标代表关键帧,即开始与结束的关键帧已经自动设置。

9. 选择动画窗口左上角的红色圆形“Record”按键以激活录制模式。按下“Record”按键后,它和时间线都会以红色突出显示。只要“录制”按钮处于活动状态,Unity 就会自动为检查器中更改的任何属性添加关键帧。

10 在右侧鼠标左键点击 0:20~0:30 之间的短竖线(0:25),然后在场景中将红色球任意放大一些,该关键帧会自动添加到已设置播放头的时间线中。

11. 点击“Record”按键附近的“Play”(横三角形状)按键预览动画。可以看到,即使只设置了三个关键帧,球也会平滑地从其起始比例调整到您更改的尺寸,然后再返回。 Unity 会自动处理关键帧之间的补间!

12. 再次点击“Play”按键停止预览动画,再点击“Record”按键停止录制动画,这样第一个动画剪辑就完成了!

13 设置Ball_Bounce 动画:点击Ball_Paulse弹出创建新动画剪辑菜单,点击“Create New Clip”创建一个新的动画剪辑,命名为Ball_Bounce, 也保存在Animations文件夹中。

14. 选择时间线窗口边右侧三个垂直省略号,并确保选择“Second”,单击上一步中相同的三个垂直省略号按钮,然后转到“Set Sample Rate”>“24”

15.单击动画编辑器中红色的“Record”按键,以便您可以立即开始编辑关键帧。

16. 单击“Add Property”按键,然后选择“Transform”旁边的下拉列表以显示“Position”。选择 "+" 按钮将其添加到动画中。

16. 在右侧鼠标左键点击 0:12位置,然后在场景中将红色球纵向y轴提高到一个位置,该关键帧会自动添加到已设置播放头的时间线中。

17. 点击“Record”按键附近的“Play”(横三角形状)按键预览动画。可以看到球也会低处自动升到高处在回到原地。 Unity 会自动处理关键帧之间的补间!

18. 再次点击“Play”按键停止预览动画,再点击“Record”按键停止录制动画,这样第二个动画剪辑就完成了!

  • 使用曲线(curve)细化动画

19. 在当前 Ball_Bounce动画编辑器窗口中,在其底部点击 Curve 按键,右边的时间窗口就显示绿色的动画曲线

20. 在曲线编辑器中右键单击动画的第一个关键帧,然后从列表中选择“Free Smooth", 出现左右对称的灰色小手柄,调节右边的手柄,变换曲线形状

21. 再在曲线中间最高点,右键单击动画的第二个关键帧,然后从列表中选择“Free Smooth", 出现左右对称的灰色小手柄,各自调节两侧手柄,变换曲线形状,例如如上图所示左边倾斜一些,右边平缓一点。

22. 在曲线最右边,右键单击动画的第三个关键帧,然后从列表中选择“Free Smooth", 出现左右对称的灰色小手柄,调节左侧手柄,变换曲线形状。

23. 点击动画播放按钮,看红色球的上下运动有无变化,例如从最高点落下时,有一点延迟。

再次点击“Play”按键停止预览动画,再点击“Record”按键停止录制动画,结束编辑!

  • 创建挤压效果

24. 在场景窗口中选择红色的球,重复上述第8个步骤,在Ball_Bounce动画编辑器中增加一个Ball:Scale属性

25. 点击红色的“Record”按键,在右侧时间窗口,选择最左边的第一帧,再将红球的 Scale 的 y 轴从 1 改为 0.6

26. 在右侧时间窗口,选择中间0:12,也就是第二帧,再将红球的 Scale 的 y 轴从 0.6 改为 1

27. 在右侧时间窗口,选择最右边的第三帧,再将红球的 Scale 的 y 轴从 1 改为 0.6。

28. 点击动画编辑窗口中的播放按键,可以看到红球在与地碰撞的时候,红球有挤压,弹离地面到最高点的时候,红球恢复形状。

再次点击“Play”按键停止预览动画,再点击“Record”按键停止录制动画,结束编辑!

保存整个场景 File > Save Scene

5.2 使用Animator控制动画

该部分将学习:使用录制模式录制游戏对象动画;将关键帧添加到动画剪辑;确定指定参数的用途;描述参数和转换之间的关系。

1. 在Unity 编辑器的项目Project窗口中,找到Scenes 文件夹,然后打开场景TutorialScene_Animation_Door

2. 选择门。选择后,移动小部件应出现在门的边缘。如果它出现在中心,请选择场景视图上方的  “切换工具手柄位置”按钮,将选择值从“中心”更改为“枢轴 Pivot”。

3.在动画编辑器中,单击创建按钮创建新的动画剪辑。出现提示时,将动画另存为项目动画文件夹中的 Door_Open。

4.  单击动画编辑器中红色的“Record”按钮, 单击添加属性按​​钮并选择 Transform > Rotation。

7.  将播放头前进到 1:00 标记处生成的关键帧,并将门的 Y 轴旋转到 90 度。

8.  通过在动画编辑器中按“播放”来预览动画。门应旋转至打开位置。如果您希望门以相反的方式打开,请编辑最终关键帧以旋转 -90 度。

9. 再次 按“播放”按键和按“录制”按键退出编辑模式。

10.在“Project”窗口中,导航至“Animations”文件夹,然后选择刚刚创建的 Door_Open 动画。 在右侧 Inspector 中,禁用循环时间。禁用此选项后,播放场景时动画将仅播放一次,而不是无限循环。

  • 设置Animator控制器 - 状态机

11.在动画文件夹中,选择 Door Animator Controller 并将其重命名为“Door_Controller”。

12.双击Door_Controller打开Animator窗口,下图颜色的方框表示门的一个状态

门可能处于的状态:
  • 目前正在打开
  • 目前正在关闭
  • 目前打开
  • 目前已关闭
确定了所有状态后,现在可以根据门的交互方式来绘制它们:

13. 在网格化 Animator 工作区域中,右键单击并选择“创建状态”(Create State) > “空”(Empty)。

14. 选择新的状态节点,然后在检查器中将名称从 New State 更改为 Closed,右键单击​​“关闭”状态并选择“设置为图层默认状态”。

Closed 状态将变为橙色,并通过橙色线连接到 Entry 节点,这表示一个转换。 Entry 节点表示状态机启动时应发生的情况。一旦场景被播放,以及每当使用Exit 节点时,它就会自动运行。

15.  对场景进行游戏测试,点击unity界面正中间上方的播放按键,可以看到门不再打开,状态栏反复处于“关闭”状态。状态机的第一部分工作了。

16. 再右键单击​​“Closed节点,然后选择“Make Transition”。鼠标光标上将出现一个白色的过渡箭头,  移动鼠标到 Door_Open 节点,再点击鼠标左键,这样过渡箭头将附加到节点。

17.  对场景进行游戏测试, 可以看到动画控制器将运行一次 Closed 节点。完成后,它将立即过渡到 Door_Open 动画,然后在动画结束时闲置。

18. 在Animator窗口左侧选择“Parameters”选项卡以访问当前空的参数列表, 在“Parameters”列表顶部,选择“添加” ( + ),然后选择“Trigger” 。  

一旦通过脚本调用,触发参数将立即转换。当您想要启动立即操作或事件以响应特定条件或用户输入(这正是该门的情况)时,触发器参数非常有用。

上图中菜单中的其他参数类型:

  • Bool:bool 参数表示二进制状态,true 或 false。当您想要基于简单的开/关条件控制不同动画状态之间的转换时,布尔参数非常有用。例如,名为“IsRunning”的布尔参数可用于根据玩家是否以更快的速度移动来在步行和跑步动画之间切换。
  • Int:int 参数表示整数值,可用于控制不同的动画状态或变化。当您想要基于离散整数值控制不同的动画变化或状态时,Int 参数非常有用。例如,名为“Health”的 int 参数可用于根据玩家当前的生命值触发不同的动画(例如,如果生命值 > 75,则触发空闲动画;如果生命值 <= 50,则触发受伤动画,​​等等)。
  • Float:浮点参数表示十进制值,通常用于控制动画之间的连续过渡和混合。当您想要在基于连续数值的动画之间平滑过渡或混合时,浮动参数非常有用。例如,名为“Speed”的浮动参数可用于根据玩家的移动速度在行走和跑步动画之间平滑过渡。

19. 将 新建的 Trigger 命名为“Trigger PlayerProximity”,注意其拼写和大小写与此处所写的完全一致。稍后会在脚本中引用它。

20. 单击白色箭头选择 Closed 和 Door_Open 之间的 Transition。在inspector中,找到 Conditions(条件)部分,  选择条件列表底部的添加( + ) 按钮。由于它是唯一的参数,Trigger PlayerProximity 将自动填充到列表中。

21. 播放场景。在参数列表中  选择Trigger PlayerProximity (点击上图中左侧(点击上图中左侧Trigger PlayerProximity右边的圆圈)旁边的单选按钮来触发它.  现在,门控制器将保持在 Closed 状态,直到选择 PlayerProximity ,此时它会转换为 Door_Open 状态,并且门会产生动画。

22. 在动画器中选择 Door_Open 节点,然后按键盘上的Ctrl / Cmd + D将其复制,  在 Inspector 中,将新节点重命名为 Door_Close, 找到 Speed 参数并将其设置为 -1,这将反转动画。

23. 再右键单击​​ Door_Open 节点并选择进行过渡,选择 Door_Close 节点以连接两个节点之间的 Transition

24. 选择新的转换,然后在右侧Inspector窗口中单击条件列表中的+按钮。 Trigger PlayerProximity 将自动填充。

25.  对场景进行游戏测试。按 Trigger PlayerProximity 单选按钮打开门,然后再按一次将其关闭。

Exit 状态

为了无限地重复使用门,一旦门关闭动画完成,状态机必须重置回其原始状态。通过使用Exit 节点来完成此任务。当转换到时,Exit 节点将自动转换到 Entry 节点,从而返回到默认状态

26. 右键单击​​ Door_Close 节点并选择"Make Transition”,选择“Exit”节点以连接两个节点之间的过渡。

27. 对场景进行游戏测试。按 Trigger PlayerProximity 单选按钮打开门,然后再按一次将其关闭。观察到状态重新从 Entry开始。

创建接近触发器

虽然手动按下 PlayerProximity Trigger 可用于测试状态机,但它不适用于实际体验。相反,触发碰撞器将与脚本一起使用,以便玩家控制器处于范围内时调用参数。触发碰撞器会检测另一个对象何时与触发器所附加的对象进行交互,并且脚本可以使用此信息来使特定的事情发生。

28.  在“Hirarchy”窗口中右键单击并选择“Create Empty”, 将空游戏对象重命名为 Door Trigger。

29.  选择“Door Trigger”后,单击Inspector窗口中中的“Add Component”按钮,然后搜索“Box Collider”并添加它。

30.  在 Box Collider 组件中,启用Is Trigger 。这会将 Box Collider 更改为触发器,将 Z 轴上的 Box Collider 大小增加到 3。

31.  布置门触发器,使其与门网重叠,触发器的一半布置在门的两侧。这将为玩家控制器创建一个足够大的区域来触发门打开。

32. 在项目Scripts文件夹中找到 DoorTrigger 脚本,并将其添加到 Door Trigger 游戏对象中。

33.  将 Door 游戏对象拖到 DoorTrigger 脚本的 Anim 参数中。这将自动将门的动画师分配给参数。

34. 打开Door Trigger脚本,将原先“PlayerProximity” 改为“Trigger PlayerProximity”,如下图硕士

35. 测试场景并走到门口

当玩家控制器进入触发器时,脚本将访问门的动画控制器并触发 PlayerProximity。当玩家控制器离开触发器时,也会发生同样的事情。

5.3 导入及共享动画

本节内容将讲述:

  • 将导入的动画剪辑应用到 Unity 中的装配模型。
  • 配置人形装备以在角色之间共享动画。
  • 修剪动画剪辑以访问其中的特定关键帧序列。
  • 为导入的装备创建一个新的动画控制器。
  • 在人形装备之间共享 Animator 控制器。
  • 确定指定参数的用途。
  • 描述参数和转换之间的关系

1.  打开位于场景文件夹中的TutorialScene_Animation_SharedAnimation_scene

2.  进入播放模式并观察场景。该场景中有几个角色一组站在平台上,但目前只有前面的角色处于动画状态。

3.  退出播放模式。

4.  在 Hierarchy 窗口中找到“Characters”组并将其展开以查看所有Characters。

5.  选择组中的所有Characters,并使用右侧Inspector窗口中的对象选择器为 Controller 参数选择 Shared_Controller 动画控制器。

6.再次 进入播放模式。所有角色都将开始动画化。尽管它们都共享相同的动画控制器,但您可能会注意到它们的动画效果不同。

7. 导航到嵌套在Animations文件夹中的Imported Animations文件夹,然后选择Dance_x3 ,再在右侧Inspector窗口中,选择“装备”Rig“”卡以显示装备导入设置,选择“动画类型”下拉列表,然后从列表中选择“Humanoid” ,再点击下方的“Apply”按键

8.  在Inpspector 中选择“Animation”选项卡以显示动画导入设置。 在剪辑部分中,选择添加( + ) 按钮两次以复制现有的动画剪辑。
9.  选择第一个标记为 Dance_x3 的剪辑,在“剪辑”下方的剪辑编辑部分中将其选中,并将 Dance_x3 剪辑重命名为 Dance_01。该剪辑将用于第一个舞蹈序列,因此需要为该特定动作定义开始和结束帧。
 

10. 在上图下方的时间线的 End (结束帧)参数中,改 350 为 150,

11. 启用Loop Time,以便动画循环播放。在Root Transform Rotation (根变换旋转)、Root Transform Position(Y) (根变换位置 (Y)) 和Root Transform Position(XZ)(根变换位置 (XZ) )中  启用“Bake Intro Pose (烘焙到姿势)”选项,

12. 选择剪辑列表中的第二个剪辑(当前名称为 Take 001),然后将其重命名为 Dance_02。

13.  将起始帧设置为 151,  将结束帧设置为 260。

14. 重复上述步骤 11,

15. 选择剪辑列表中的第三个剪辑(当前名称为 Take 002),然后将其重命名为 Dance_03。

16.  将起始帧设置为 261,  将结束帧设置为 350。

17. 重复上述步骤 11,

18. 向下滚动到检查器的最底部,然后选择“Apply”以保存所有导入更改。

  • 动画控制器控制动画剪辑

19. 在Assets>animations文件夹中,找到 Shared_Controller 动画控制器并双击在Animator中将其打开。

20.在导入的动画文件夹中找到 Dance_x3 动画并将其展开以显示所有三个新的动画剪辑 Dance_01, Dance_02, Dance_03, 将三个舞蹈剪辑拖到动画器中任意状态节点右侧的某个位置。
当动画剪辑拖到动画器中时,它会自动从该剪辑创建动画状态。

move animiation clip

21. 在动画器的参数选项卡中  选择添加( + ) 按钮,然后从列表中选择触发器,  将新的名称命名为 Dance_01,注意其拼写和大小写与此处所写的完全一致,否则脚本将无法工作。

22.  再创建两个触发器并将它们命名为 Dance_02 和 Dance_03

场景中的每个 Charactor 都附有一个名为 DanceParty 的脚本。该脚本的功能很简单;当应用程序运行时,脚本访问每个角色的动画师并开始查找用户的键盘输入。如果用户按 Q、W 或 E,则脚本将分别调用名为 Dance_01、Dance_02 或 Dance_03 的触发参数。

23.  右键单击​​ Any State 节点,选择 Make Transition,并将其连接到 Dance_01 节点,   选择新的过渡,然后在检查器中单击条件部分中的 + 按钮,然后从列表中选择 Dance_01.

24.  右键单击​​ Dance_01 节点,选择 Make Transition,并将其连接到 Exit 节点。

25. 对 Dance_02 和 Dance_03 重复此过程

26. 运行播放游戏,按 Q、W 和 E 按键,可以看到舞蹈切换。

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值