Unity-动画

动画系统概述(Animation System)

注:animation animator组件是不一样的,animation是旧板的动画系统。

Unity拥有丰富而精致的动画系统(有时称为Mecanim ")。它提供:

  • 简单的工作流程和设置动画的所有元素,包括对象,角色和属性。
  • 支持导入在Unity内创建的动画剪辑animation clips )和动画
  • 人型动画重新定位 (retargeting)- 将动画从一个角色模型应用到另一个角色的能力。
  • 简化的动画片段对齐工作流程。
  • 方便的预览动画剪辑,转换和交互之间。这使得Animator更独立于程序员。预览他们的动画,在游戏代码被连接进来之前。
  • 管理动画与可视化编程工具之间的复杂交互。
  • 用不同的逻辑对不同的身体部位进行动画。
  • 分层和掩蔽功能

    "Animator"窗口中的动画状态机的典型视图

    动画工作流程

    Unity的动画系统基于动画剪辑的概念,其中包含有关某些对象如何随时间更改其位置,旋转或其他属性的信息。

    然后,将动画剪辑组织成一个结构化的流程图状系统,称为Animator控制器。Animator控制器充当一个"状态机",它可以跟踪当前播放的片段,以及动画应该何时改变或混合在一起。

    这些动画片段,动画剪辑(Animation Clips)Animator Controller,通过Animator组件链接到一个GameObject。这个组件有一个对Animator Controller的引用。Animator Controller依次包含它所使用的动画剪辑的引用。

    Unity的动画系统(被称为"Mecanim")带有很多概念和术语。如果在任何时候,你需要找出什么意思,去我们的动画词汇表

    使用"动画(Animation Windows"视图

    动画视图用于预览和编辑GameObject动画片段动画。要在Unity中打开"动画"视图,请转到Windows" >" animation"

    查看GameObject的动画

    动画视图与层次视图、项目窗口、场景视图和检查器窗口相关联。与检查器一样,动画视图显示当前选择的GameObjectAnimation Clip 资产的动画的时间轴和关键帧。使用层次视图或场景视图选择一个GameObject,并使用项目窗口选择一个动画剪辑资产。

    动画属性列表

    在下图中,动画视图(左)显示当前所选GameObject使用的动画及其GameObject,如果它们也受此Animation控制。"场景"视图和"层次结构"视图位于右侧,显示"动画"视图显示当前所选GameObject附带的动画。

    动画视图的左侧是动画属性的列表。在未创建动画的新创建的剪辑中,此列表为空。

    动画视图显示空剪辑。左边没有显示任何属性。

    当您开始为此剪辑中的各种属性设置动画时,动画属性将显示在此处。如果动画控制多个子对象,该列表还将包括每个子对象的动画属性的分层子列表。在上面的例子中,机器人手的GameObject层次结构的各个部分都在相同的动画剪辑中动画。

    注意:在像这样的单个剪辑中动画GameObject的层次结构时,请确保在层次结构中的根GameObject上创建动画。

    关键帧:有动画动作的帧。

    每个属性可以折叠和展开,以显示在每个关键帧记录的确切值。如果播放头(红线)在关键帧之间,则值字段显示内插值。您可以直接编辑这些字段。如果播放头在关键帧之上进行更改,关键帧的值将被修改。如果播放头在关键帧之间进行更改(因此显示的值是内插值),则在该点创建新关键帧,并输入新值。

    动画视图中的展开属性,允许直接键入关键帧值。在该图像中,显示内插值,因为播放头(红线)在关键帧之间。此时输入新值将创建一个新的关键帧。

    动画时间轴

    在动画视图的右侧是当前剪辑的时间轴。每个动画属性的关键帧显示在此时间轴中。时间轴视图有两种模式:Dopesheet涂料表Curves(曲线)。要在这些模式之间切换,请单击动画属性列表区域底部的DopesheetCurves

    这些提供了动画时间轴和关键帧数据的两个备选视图。

    Dopesheet(涂料表)时间轴模式

    Dopesheet模式提供了更紧凑的视图,允许您在单个水平轨道中查看每个属性的关键帧序列。这允许您查看多个属性或GameObject的关键帧时序的简单概述。

    这里的动画窗口处于"涂料表"模式,显示"动画"剪辑中所有动画属性的关键帧位置

    有关详细信息,请参阅Dopesheet模式下的关键操作文档。

    Curves(曲线)时间轴模式

    曲线模式显示了一个可调整的图形,它包含了每个动画属性的值随时间变化的视图。所有选定的属性都出现在相同的图形视图中。这种模式允许您对查看和编辑值有很大的控制权,以及它们是如何在中间插值的。

    这里,动画窗口显示了此Animation剪辑中四个选定GameObjects的旋转数据的曲线

    选择适合您的窗口

    当使用曲线模式查看动画时,了解有时每个属性的各种范围有很大差异是很重要的。例如,考虑一个用于旋转弹跳立方体的简单动画剪辑。弹跳Y位置值可能在02之间变化(意味着立方体在动画期间弹出2个单位高)然而,旋转值从0360(表示其旋转角度)。当同时查看这两条曲线时,Y位置值的动画曲线将非常困难,因为视图将被缩小以适合窗口内旋转值的0-360范围:

    弹跳式立方体的位置和旋转曲线都被选中,但是由于视图被缩小以适应旋转曲线的0-360范围,弹性Y位置曲线不容易辨别

    按键盘上的F可将视图放大到当前所选的关键帧。这是一种快速的方法,可以在"动画"时间轴的一部分上对焦点和重新缩放窗口进行重新缩放,以便于编辑。

    单击列表中的各个属性,然后按键盘上的F自动重新缩放视图以适应该值的范围。您还可以使用视图的滚动条滑块两端的滚动条来手动调整曲线"窗口的缩放。在下图中,动画窗口被放大以查看弹出的Y位置动画。黄色旋转曲线的开始仍然可见,但现在延伸到视图顶部:

    按键盘上的A适合并重新缩放窗口,以显示剪辑中的所有关键帧,无论选择了哪些关键帧。如果您希望在保留当前选择的同时查看整个时间轴,这很有用:

    播放和框架导航控件

    要控制动画剪辑播放,请使用动画"视图左上方的播放控制 "

    框架导航

    从左到右,这些控件是:

  • 记录模式(切换开/关)
  • 将播放头移动到剪辑的开头
  • 将播放头移动到以前的关键帧
  • 播放动画
  • 将播放头移动到下一个关键帧
  • 将播放头移动到剪辑的末尾

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

  • 逗号)转到上一帧。
  • Period)进入下一帧。
  • 按住Alt并按逗号)转到上一个关键帧
  • 按住Alt并按下句号()以转到下一个关键帧

    锁定窗口

    您可以锁定动画编辑器窗口,使其不会自动切换以反映层次结构或场景中当前选定的GameObject。锁定窗口是有用的,如果你想集中在一个特定的GameObject的动画,并仍然能够选择和操纵其他GameObjects在场景中。

    锁定按钮

    创建新的动画片段(animation clip

    为了在Unity中动画游戏对象,对象或对象需要附加Animator组件。此动画组件必须引用动画控制器(animator controller,该控制器又包含对一个或多个动画片段(animation clip)的引用。

    为所选的GameObject 创建一个新的动画片段,请确保动画窗口(animation window可见。

    如果GameObject尚未分配任何动画片段,您将在"动画窗口"时间轴区域的中心看到"创建"按钮。单击创建按钮。然后系统会提示您将新的空的Animation Clip保存在Assets文件夹中的某处。

    创建一个新的动画剪辑

    一旦你保存了这个新的空的动画剪辑,一些事情会自动发生:

  • 将创建一个新的动画控制器资产
  • 正在创建的新剪辑将作为默认状态添加到动画控制器中
  • animator组件将被添加到动画的GameObject
  • Animator组件将拥有分配给它的新的Animator控制器

    这个自动序列的结果是,动画系统的所有必需元素都为您设置,您现在可以开始对对象进行动画。

    添加另一个动画剪辑

    如果游戏对象已经分配了一个或多个动画片段,则"创建"按钮将不可见。相反,其中一个剪辑将在动画窗口中可见。您可以通过使用"动画"窗口左上方的菜单,在播放控件的下方,在该窗口中切换动画剪辑。

    如果要在已有动画的对象上创建新的动画剪辑,则必须从此菜单中选择"创建新剪辑"。再次,系统将提示您保存新的空的Animation Clip,然后才能使用它。

    向已经分配了一些剪辑的对象添加一个新的动画剪辑

    它们如何配合在一起

    虽然上面的步骤会自动地设置相关的组件和引用,但是了解哪些部分必须连接在一起是很有用的。

  • GameObject必须具有Animator组件
  • Animator组件必须分配一个Animator Controller资产
  • 动画控制器资产必须分配一个或多个动画片段(animation clip

    下图显示了如何从动画窗口中创建的新动画片段开始分配这些片段:

    创建一个新的剪辑,并作为资产保存。该剪辑被自动添加为新的Animator controller的默认状态,也作为资产保存。Animator控制器被分配给一个添加到GameObject的Animator组件。

    在下图中,您可以看到尚未动画的选择的GameObject"Cube")。我们只有一个简单的立方体,没有Animator组件。为了清晰起见,动画,层次结构,项目和检查器窗口并排排列。

    之前:选择未动画的游戏对象("立方体")。它还没有Animator Component,并且没有Animator Controller。

    通过在"动画"视图中按创建按钮,将创建一个新的动画剪辑。Unity将要求选择名称和位置来保存这个新的Animation ClipUnity还创建一个与所选GameObject相同名称的Animator Controller资产,并将一个Animator组件添加到GameObject中,并自动地设置资产。

    之后:创建新剪辑后,您可以看到在项目窗口中创建的新资产以及在"检查器"窗口(最右侧)分配的Animator 组件。您还可以在Animator 窗口中看到分配为默认状态的新剪辑

    在上面的新视图中,您可以看到:

  • 动画窗口(左上角)现在显示具有红色播放头线的时间线,准备好记录新的关键帧。剪辑的名称在剪辑菜单中可见,正好位于播放控件栏的下方。
  • 检查器(中心)显示立方体GameObject现在已添加一个animator组件组件"控制器"字段显示一个名为"Cube"的动画控制器资产被分配
  • 项目窗口(右下方)显示已创建两个新资产 - 名为"Cube"的动画控制器资产和称为"Cube Animation Clip"的动画剪辑资产
  • Animator窗口(左下角)显示Animator Controller的内容 - 您可以看到Cube Animation Clip已添加到控制器,并且它是橙色指示的"默认状态"。添加到控制器的后续剪辑将具有灰色,表示它们不是默认状态。

    动画游戏对象

    一旦保存了新的动画剪辑资产,就可以开始向剪辑添加关键帧了。要开始编辑所选游戏对象的动画剪辑,请单击动画记录按钮。这将进入动画记录模式,游戏对象的更改记录到动画剪辑中

    记录按钮

    您可以通过再次单击动画模式按钮来停止动画记录模式。这将使游戏对象恢复到在进入动画模式之前的状态。

    您对GameObject所做的更改将被记录为动画窗口中红线所示当前时间的关键帧。

    您可以通过在动画记录模式中操作对象来激活对象的任何属性。移动、旋转或缩放对象将在动画剪辑中为这些属性添加相应的关键帧。在对象的检查器中直接调整值也会在记录模式中添加关键帧。这适用于检查器中的任何属性,包括数字值、复选框、颜色和大多数其他值。

    GameObject的任何动画属性都显示在动画窗口左侧的属性列表中。未动画的属性在此窗口中未显示。动画的任何新属性,包括子对象的属性,一旦开始动画化,就会添加到属性列表区域。

    变换属性是特殊的,因为.x.y.z属性是链接的,所以一次添加三个曲线。

    您还可以通过单击添加属性按钮将当前GameObject(及其子项)添加动画属性。单击此按钮将显示GameObject的动画属性的弹出列表。这些对应于您可以在检查器中列出的属性。

    当您单击" 添加属性(Add Property)"按钮时,将显示GameObject的可动画属性

    动画模式下,红色垂直线将显示当前预览的动画片段的哪一帧。检查器"场景视图"将在"动画剪辑"的列表中显示"游戏对象"。该列表上动画属性的值也显示在属性名称右侧的列中。

    在动画模式中,红色垂直线显示当前预览的帧。

    当前列表

    时间线

    您可以点击时间线上的任意位置预览或修改动画片段中的该帧。时间线中的数字显示为秒和帧,因此1:30表示1秒和30帧。

    时间线

    动画模式

    在动画模式中,你可以在场景视图中移动、旋转或缩放游戏对象。这将自动为动画剪辑的位置、旋转和缩放属性创建动画曲线,如果它们不存在,那么这些动画曲线上的键将自动在当前预览帧中创建,以存储您更改的相应的转换值。

    您还可以使用检查器来修改游戏对象的其他可动画属性。这也会根据需要创建动画曲线,并在当前预览帧中创建关键帧,以存储更改后的值。

    关键帧创建

    您可以使用添加关键帧按钮手动创建关键帧。这将为动画视图"中当前选择的所有属性创建一个键。这对于仅选择性地将键添加到特定属性时很有用。

    添加关键帧按钮

    使用动画曲线

    属性列表

    动画剪辑中,任何可动画属性都可以具有动画曲线,这意味着Animation Clip可以控制该属性随时间的变化。在动画视图(左侧)的属性列表区域中,列出了所有当前动画的属性。使用"Dope Sheet"模式下的"动画视图",每个属性的动画值仅显示为线性轨迹,但是在"曲线"模式下,您可以看到可视化为图形上线条的属性的变化值。无论您使用哪种模式查看,曲线仍然存在 - Dope Sheet模式仅提供仅在关键帧发生时显示的数据的简化视图。

    曲线模式下,动画曲线具有彩色曲线指示符,每种颜色表示属性列表中当前选定属性之一的值。有关如何向动画属性添加曲线的信息,请参阅使用动画视图"部分

    动画曲线与颜色指示器可见。在此示例中,绿色指示符与弹跳立方体动画的Y位置曲线匹配

    了解曲线,键和关键帧

    一个动画曲线具有多个键(key,所述曲线经过它们的控制点。这些在曲线编辑器中可视化为曲线上的小钻石形状。其中一个或多个所示曲线具有的框架称为关键帧

    如果属性在当前预览的框架中有一个,则曲线指示器将具有菱形形状,并且属性列表也将具有该值旁边的菱形。

    Position.y属性在当前预览框。

    曲线编辑器将只显示所选择的属性曲线。如果在属性列表中选择了多个属性,曲线将显示为叠加在一起。

    当选择多个属性时,它们的曲线显示为叠加在曲线编辑器中

    添加和移动关键帧

    您可以通过单击关键帧按钮在当前预览的框架中添加关键帧

    通过点击关键帧按钮,可以在当前预览帧中添加一个关键帧。这将为所有当前选择的曲线添加一个关键帧。或者,您可以在任何给定的帧中通过双击新关键帧的位置,在任何给定的帧中添加一个关键帧。还可以通过右键单击关键帧线并从上下文(右键)菜单中选择添加关键帧来添加关键帧。一旦放置,关键帧就可以被鼠标拖动。同时也可以选择多个关键帧来拖拽。可以通过选择和按下删除键(退格键也可以)来删除关键帧,或者右键单击它们,然后从上下文(右键)菜单中选择删除关键帧。

    支持的动画属性

    动画视图可以用于动画,而不仅仅是一个游戏对象的位置、旋转和缩放。任何组件和材料的属性都可以是动画的——甚至是您自己的脚本组件的公共变量。制作具有复杂视觉效果和行为的动画只是为相关属性添加动画曲线的问题。

    动画系统支持以下类型的属性:

  • Float
  • Color
  • Vector2
  • Vector3
  • Vector4
  • 四元数
  • 布尔值

    数组不受支持,也不是以上列出的结构体或对象。

    对于布尔值属性,值为0等于False而任何其他值等于True

    以下是动画视图可用于以下方面的许多示例:

    使光的颜色和强度使它闪烁、闪烁或脉动。

    使音源的音高和音量,使声音的资产的大小降到最低。

    使材料的纹理偏移,模拟移动的带子或轨道,流动的水,或特殊效果。

    动画的发射状态和速度的多个椭球粒子发射器,创造壮观的烟火或喷泉显示。

    随着时间的推移,您自己的脚本组件的动画变量使事情的行为有不同的表现。

    当使用动画曲线来控制游戏逻辑时,请注意动画回放和在Unity中采样的方式

    旋转插值类型

    Unity旋转内部表示为四元数。四位数由xyzw值组成,通常不会手动修改,除非知道他们正在做什么的人员。相反,旋转通常使用欧拉角操作,其具有代表围绕这三个相应轴的旋转的xyz值。

    四元插值

    SB谁用。

    欧拉角度插值

    欧拉角插值是大多数人都习惯使用的。欧拉角可以表示任意的大型旋转和。xy,z曲线是相互独立的。欧拉角插值在同一时间绕多个轴旋转时,可以受到诸如万向节锁这样的工件的影响,但在一个时间轴上的简单旋转是直观的。当使用欧拉角插值时,内部的统一将曲线转换成内部使用的四元数表示法。

    编辑曲线

    Unity 编辑器中有几个不同的功能和窗口,它们使用曲线来显示和编辑数据。您可以用来查看和操作曲线的方法在所有这些方面都是相同的,尽管有一些例外。

  • 动画视图使用曲线来显示,并在随时间编辑动画动画剪辑属性的值。

    动画视图。

  • 脚本组件可以具有类型为AnimationCurve成员变量,可用于各种事物。单击检查器中的标识即可打开曲线编辑器

    曲线编辑器。

    • 音频源组件使用曲线来控制滚动条和其他属性作为距离到音频源的函数。

    Inspector中AudioSource组件中的距离函数曲线。

    虽然这些控件具有微妙的差异,但曲线可以以完全相同的方式进行编辑。本页介绍如何在这些控件中导航和编辑曲线。

    在曲线上添加和移动键

    一个键可以被添加到曲线上,双击曲线上的关键帧位置。还可以通过右键单击曲线并从上下文菜单中选择add key来添加键。

    一旦放置,可以用鼠标拖动:

  • 点击一个选择它。用鼠标拖动所选的
  • 一次也可以选择多个
  • 要一次选择多个,请按住Shift同时单击键。
  • 要取消选择所选的,请按住Shift再次单击。
  • 要选择矩形区域中的所有,请单击空白处并拖动以形成矩形选择。
  • 也可以通过按住Shift键将矩形选择添加到现有的选定键。

    可以通过选择并按Delete(删除)键或右键单击键并从上下文菜单中选择Delete Key删除键)删除键

    编辑键

    曲线编辑器中键值的直接编辑是Unity 5.1中的一个新特性。使用上下文菜单开始编辑选定的键。

    浏览曲线视图

    当使用动画视图时,您可以轻松放大要使用的曲线的细节,或者缩小以获得全部图像。

    您可以随时按F来完全对所显示的曲线或选定的键进行帧选择。

    缩放

    使用使用鼠标滚轮可以缩放

    您只能放大水平或垂直轴:

  • 放大的同时按住Shift垂直缩放。

    编辑切线

    一个键有两个切线 - 一个在左边为入口斜坡,一个在右边为出口斜坡。切线控制键之间曲线的形状。您可以从多个不同的切线类型中进行选择,以控制曲线如何离开一个键并到达下一个键。右键单击一个键以选择该键的切线类型。

    为了使动画值在通过键时平滑地改变,左右切线必须是共线的。以下切线类型确保平滑度:

    • 自动锁定(Clamped Auto:这是默认的切线模式。切线是自动设置的,使曲线顺利通过键。在编辑键的位置或时间时,键被移动时,切线会自动进入斜率和水平:

  • 自动(Auto):这是一个旧的切线模式,并且仍然是与旧项目向后兼容的选项。除非您有特定的理由使用此模式,否则请使用默认的自动锁定"
  • 自由平滑(Free Smooth):拖动切线手柄以自由设置切线。它们被锁定为共线性以确保平滑度。

  • 平面(Flat):切线设置为水平(这是Free Smooth的特殊情况)。

    有时你可能不想让曲线在通过键时这么顺利。要在曲线中产生急剧变化,请选择断线Broken 切线模式之一。

    Left:,Right:,Both:两边

    当使用破碎的切线时,可以单独设置左右切线。左右切线中的每一个都可以设置为以下类型之一:

  • 破碎 - 自由(Free):拖动切线手柄以自由设置切线。

  • 断线 - 线性(Linear):切线指向相邻键。要制作线性曲线段,将两端的切线设置为线性"。在下面的示例中,所有三个键都已设置为Broken - Linear,以实现从键到键的直线。

  • Broken – Constant(常量):曲线在两个键之间保持一个恒定的值。左键的值决定曲线段的值。

    Dopesheet模式下的键操作

    Box选择用于在Dopesheet模式下查看动画窗口时选择多个按键。这允许您一次选择和操作几个键。

    以下操作允许您选择多个键:

  • 按住Shift +单击可将各个键添加到您的选择
  • 用鼠标拖动一个矩形来选择一组键
  • 按住Shift并拖动矩形以将当前选择的一组键添加或删除

    Dopesheet模式下拖动一个矩形以选择多个键

    当您向选择键添加键时,矩形选框将显示在所选按键的两侧。如果您向选择中添加或删除更多的键,选框将自动调整其位置和大小,以包含所有当前选定的键。

    矩形选框,显示在所选键的左侧和右侧

    使用矩形选框的两个手柄来移动,缩放和波纹编辑所选的按键(参见下面的波纹编辑)。

    移动选定的键

    单击"框选择"中的任意位置以拖动所选的键并移动它们。您不需要直接单击一个键来执行此操作您可以通过单击矩形选框中的空白处拖动。

    拖动时,第一个和最后一个键的时间显示在时间轴栏下,以帮助您将键放在所需的位置。在向左拖动一些按键的同时,释放鼠标按钮时会删除任何在负时间(也就是时间线上的0标记左侧)的键。

    拖动选择的键。请注意在顶部时间轴栏下显示的选择的开始和结束时间。

    缩放所选的键

    当您选择了多个键时,您可以缩放所选的键,或者将它们分开更长的时间段(使所选动画变慢),或者将它们靠近在一起,以占用更短的时间段(使所选动画更快)。要缩放所选的键,请单击并按住所选键左侧和右侧的蓝色"框选择"手柄中的任意一个,然后水平拖动。

    当您缩放时,第一个和最后一个键的时间显示在时间轴栏下,以帮助您将键缩放到所需的位置。当将选择的键缩放到较小的时间量时,一些键可能会在彼此相同的框架上结束。如果发生这种情况,当释放鼠标按钮时,占用同一帧的额外的键将被丢弃,只保留最后一个键。

    缩放选择的键。请注意在顶部时间轴栏下显示的选择的开始和结束时间。

    波纹编辑

    纹波编辑是一种移动和缩放选定键的方法。此方法还会影响与您正在操作的键相同的时间轴上的非选择键。这个名称指的是让你的其他内容自动沿着时间轴移动,以适应你添加、扩展或缩小的内容。编辑的效果会在整个时间轴上产生"涟漪效应"。

    按住R键,同时拖动矩形选框来执行波纹移动。

    按住R键,拖动一个矩形方框手柄来执行波纹缩放。时间轴上未被选中键的其余部分的影响与波纹移动完全相同——它们被推到左边或右边,当你缩放到你的方框选择的左边或右边。

    曲线模式下的键操作

    曲线"模式下查看"动画"窗口时,"盒子选择"用于选择多个按键。这允许您一次选择和操作几个键。

    以下操作允许您选择多个键:

  • 按住Shift +单击可将各个键添加到您的选择
  • 用鼠标拖动一个矩形来选择一组键
  • 按住Shift并拖动矩形以将当前选择的一组键添加或删除

    在" 曲线"模式下,拖动一个矩形以选择多个键

    当您添加选择的键时,Box Selection手柄出现在所选按键的两侧,并在顶部和底部。如果您向选择中添加或删除更多的键,手柄将自动调整其位置和大小,以包含所有当前选定的键。

    Box选择手柄,显示在选定键的所有边

    移动选定的键

    单击"框选择"手柄中的任意位置以拖动所选的键并移动它们。您不需要直接单击一个键来执行此操作您可以通过单击Box Selection句柄中的空白处拖动。

    拖动时,第一个和最后一个键的时间显示在时间轴栏下,以帮助您将键放在所需的位置。在向左拖动一些按键的同时,释放鼠标按钮时会删除任何在负时间(也就是时间线上的0标记左侧)的键。

    拖动选择的键。请注意在顶部时间轴栏下显示的选择的开始和结束时间。

    缩放所选的键

    当您选择了多个键时,您可以缩放所选的键。在曲线模式下,您可以水平缩放以更改键的时间位置,也可以垂直更改键的值。

    水平缩放选定的键

    使用所选键左侧和右侧的"框选择"手柄可水平缩放选择。这会更改键的时间位置,而无需修改其值。将手柄分开拉伸较长时间的键(使所选动画变慢),或将它们靠近在一起,将键放在较短的时间段内(使所选动画更快)。

    当您水平缩放选择时,键的最小和最大时间将显示在视图的顶部,以帮助您将选择设置为所需的时间。

    水平缩放选择的键。注意视图顶部显示的缩放键的最小和最大倍数。

    垂直缩放所选的键

    使用所选键的顶部和底部的"框选择"手柄可垂直缩放选择。这将更改键的值,而不会修改其时间位置。

    当您垂直缩放选择时,键的最小和最大值显示在视图的左侧,以帮助您将选择设置为所需的值。

    垂直缩放选择的键,修改其值,同时保留时间。视图显示在左侧的缩放键的新的最小值和最大值。

    操纵杆

    除了选择的键周围显示的"盒子选择"手柄之外,还有曲线"窗口顶部和左侧的灰色操作条,可以提供其他方式来操作当前的选择。

    操纵杆,以红色突出显示

    顶部的操纵杆允许您修改所选键的时间位置,同时保留其值。侧面的酒吧允许您修改键的值,同时保留其时间位置。

    波纹编辑

    同上

    使用动画事件

    您可以使用"动画事件"来增加动画剪辑的有用性,这样可以在时间轴的指定点处调用对象脚本中的函数。

    动画事件调用的函数也可以选择一个参数。所述参数可以是floatstringint,或object引用或AnimationEvent对象。AnimationEvent对象具有成员变量,允许将floatstringintegerobject引用一次性传递到函数中,以及触发函数调用的其他有关事件的信息。

    // 这个C# 函数能被动画事事件回调

    public void PrintFloat (float theValue) {

    Debug.Log (theValue);

    }

    要将动画事件添加到当前播放头位置的剪辑,请单击事件(Event)(左边红框框)按钮。将动画事件添加到动画中的任何一点。或者双击要触发事件的点的事件行。添加后,您可以拖动鼠标重新定位事件。要删除事件,请选择它并按Delete键,或右键单击它并选择删除事件(Delete Event)

    事件行显示动画事件。通过双击事件行或使用事件按钮添加新的动画事件

    添加事件时,检查器窗口将显示几个字段。这些字段允许您指定要调用的函数的名称,以及要传递给它的参数的值。

    动画事件 Inspector窗口

    添加到剪辑中的事件在事件行中显示为标记。将鼠标悬停在标记上以显示带有功能名称和参数值的工具提示。

    您可以在时间轴中选择和操作多个事件。

    要在时间轴中选择多个事件,请按住Shift键并逐个选择事件标记,将其添加到您的选择。您也可以拖动选择框在事件标记区域内单击并拖动,如下所示:

    示例

    这个例子演示了如何将动画事件添加到一个简单的GameObject。在执行所有步骤时,立方体将在播放模式下沿x轴向前和向后移动,每1秒在控制台中显示事件消息,时间为0.8秒。

    该示例需要具有该PrintEvent()函数的脚本。此函数打印一个调试消息,其中包含一个字符串("(called at)调用在:")和时间:

    using UnityEngine;

    using System.Collections;

     

     

    public class ExampleClass : MonoBehaviour {

    public void PrintEvent(string s) {

    Debug.Log("PrintEvent: " + s + " called at: " + Time.time);

    }

    }

    使用此示例代码创建脚本文件,并将其放在Project文件夹中(右键单击Unity中的Project窗口中,然后选择Create > CScript,然后将上述代码示例复制并粘贴到文件中并保存)。

    Unity中,创建一个Cube GameObject(菜单:GameObject > 3D Object > Cube)。将上面的脚本从"项目"窗口拖放到"检查器"窗口中。

    选择Cube,然后打开动画窗口(菜单:Windows > Animation)。设置x坐标的位置曲线。

    动画窗口

    接下来,设置x坐标的动画增加到大约0.4,然后在1秒钟内恢复为零,然后在大约0.8秒创建一个动画事件。按播放运行动画,查看效果。

    动画(Animator Window)窗口

    注意:Animator Animation两个窗口不同,两个相关联,但是Animator用于管理Animation

    动画窗口允许您创建,查看和修改动画控制器资产。

    动画窗口显示一个新的空动画控制器资产

    动画师窗口有两个主要部分:主网格布局区域和左侧图层和参数窗格。

    动画窗口的布局区域

    具有深灰色网格的主要部分是布局区域。您可以使用此区域创建,排列和连接动画控制器中的状态

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

    参数视图,创建两个示例参数。

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

    图层视图

    当左侧窗格切换到"图层"视图时,可以在"动画制作器"中创建,查看和编辑图层。这允许您在单个动画控制器中同时具有多层动画,每个动画都由单独的状态机控制。一个常见的用法是,在一个基本层上有一个单独的层来播放上体动画,它控制一个角色的一般动作动画。

    要添加图层,请单击加号图标。要删除图层,请选择图层,然后按删除键。

    图层和参数隐藏图标

    单击"眼睛"图标打开或关闭将显示或隐藏"参数和图层"侧窗格,让您有更多空间查看和编辑状态机。

    分层导航位置

    当前状态机中的"导航痕迹"分层位置。状态可以包含子状态和树,这些结构可以重复嵌套。

    锁图标

    inspector类似。

    动画参数

    注:由于太过简单,有些部分已经删除,状态机的知识请自行百度。

    动画参数是在Animator Controller中定义的变量,可以从脚本中访问并分配值。脚本可以控制或影响状态机的流程。

    例如,可以通过动画曲线来更新参数的值,然后从脚本访问,使得声音效果的音调可以如同是一段动画一样变化。同样,脚本可以设置由Mecanim设置的参数值。例如,脚本可以设置一个参数来控制混合树

    可以使用"动画制作器"窗口的"参数"部分设置默认参数值,可在"动画制作工具"窗口的右上角选择。它们可以有四种基本类型:

  • INT -整数
  • Float –浮点数
  • Bool - 真值或假值(由复选框表示)
  • Trigger - 由转换器消耗的控制器复位的布尔参数(由圆形按钮表示)

    参数可以使用Animator类中的函数从脚本中分配值:SetFloatSetIntSetBoolSetTriggerResetTrigger

    这是一个基于用户输入和冲突检测修改参数的脚本的例子。

    using UnityEngine;
    

    using System.Collections;
    

    public class SimplePlayer : MonoBehaviour {
    

     

        Animator animator;
    

     

        // Use this for initialization
    

        void Start () {
    

            animator = GetComponent<Animator>();
    

        }
    

     

        // Update is called once per frame
    

        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");
    

            }
    

        }
    

    }
    							

    状态机转换

    状态机转换是为了帮助您简化大型或复杂的状态机。

    动画窗口中的每个视图都有一个Entry(入口)和Exit(出口)节点。这些在状态机转换期间使用。

    注:没看到就到处拖拖。

    当进入状态机时使用Entry节点。进入节点将根据条件对目标状态进行评估并将其分支到目标状态。通过这种方式,进入节点可以在状态机启动时通过评估参数的状态来控制状态机的启动状态。

    由于状态机始终具有默认状态,因此将始终存在从入口节点分支到默认状态的默认转换。

    具有单个默认条目转换的入口节点,默认状态为橙色

    然后,您可以从Entry节点添加额外的转换到其他状态,以控制状态机是否应该以不同的状态开始。

    具有多个入口转换的入口节点

    Exit节点用于指示状态机应该退出。

    状态机中的每个子状态被认为是一个单独的完整的状态机,因此通过使用这些入口和出口节点,您可以更优雅地控制从顶级状态机到其子状态机的流程。

    可以将状态机转换与常规状态转换混合在一起,这样就有可能从状态过渡到状态,从状态到状态机,从一个状态机到另一个状态机。

    状态机行为(State Machine Behaviours

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

    使用此功能的几个示例可能是:

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

    状态机行为可以创建和添加到状态,与您创建和添加脚本到GameObject的方式非常相似。选择状态机中的状态,然后在检查器中使用"添加行为"按钮选择现有的StateMachineBehaviour或创建一个新状态。

    具有附加到"接地"状态的状态机

    状态机行为脚本可以访问当动画师进入,更新和退出不同状态(或子状态机)时调用的许多事件。还有一些事件允许您处理根运动和反向运动学调用。

    子状态机

    一个字符具有复杂的动作,由多个阶段组成。与其用单个状态处理整个操作,还不如确定各自的阶段,并为每个阶段分别使用一个单独的状态。例如,一个角色可能有一个叫做"技巧射击"的动作,在那里它会蜷缩着以稳定的目标,射门,然后再站起来。

    "技巧射击"行动中的状态序列

    尽管这对于控制目的很有用,但缺点是,随着这些复杂操作的增加,状态机将变得庞大而笨拙。您可以通过在编辑器中以可视化的方式将不同的状态组分离出来,从而简化一些事情。然而,Mecanim比这更进一步,允许您将一组状态折叠成状态机图中的一个命名项。这些崩溃的状态组被称为子状态机。

    您可以通过右键单击动画控制器"窗口中的空白空间并从上下文菜单中选择创建子状态机"创建子状态机。子状态机在编辑器中由细长的六边形表示,以将其与正常状态区分开。

    子状态机

    当您双击六边形时,编辑器将被清除,让您可以自己编辑子状态机,就像它是一个完全独立的状态机一样。窗口顶部的栏显示一个"导航痕迹",显示当前正在编辑的子状态机(请注意,您可以在其他子状态机中创建子状态机,等等)。单击轨迹中的项目将将编辑器重点放在特定的子状态机上

    当您双击六边形时,编辑器可以让您编辑子状态机,就像它本身是完全独立的状态机一样。窗口顶部的显示了一个路径,以显示当前正在编辑的子状态机(注意,您可以在其他子状态机器中创建子状态机,等等)。在路径中单击一个项目将使编辑器专注于该特定的子状态机。。

    "浏览路径记录"

    外部转换

    如上所述,子状态机只是在编辑器中视觉折叠一组状态的一种方式,因此当您转换到子状态机时,您必须选择要连接到哪个状态。

    在"Trickshot(技巧射击)"子状态机中选择目标状态

    您将在子状态机中注意到其名称以Up开头的额外状态。

    "向上"状态

    向上状态表示"外面的世界",包围子状态机视图状态机。如果从子状态机中的状态添加到Up状态,则会提示您选择要连接的封闭机器的其中一种状态。

    连接到外部状态机中的状态

    独奏(Solo)和静音(Mute)功能

    在复杂状态机中,分别预览机器某些部件的操作是有用的。为此,您可以使用静音/独奏功能。静音意味着转换将被禁用。启用独奏的转换,并且相对于源自相同状态的其他转换。您可以从过渡检查器状态检查器(推荐)设置静音和独立状态,其中将概述来自该状态的所有转换。

    独奏转换将以绿色显示,而静音转换为红色,如下所示:

    在上面的例子中,如果你在State 0,只有转换到State A并将State B可用。

  • 基本的经验法则是,如果一个Solo被勾选,则该状态的其余转换将被静音。
  • 如果SoloMute都被勾选,则静音优先。

    已知的问题:

  • 控制器图形当前并不总是反映发动机的内部静音状态。

     

    动画片段

     

    循环时间

    启用此选项可使动画片段播放,并在到达结束时重新启动。

            循环姿势

    启用使无缝运动循环。

            偏移(Offset

    偏移到根旋转()

    动画组件

    动画组件用于将动画分配给场景中的GameObjectAnimator组件需要引用动画控制器,该动画控制器定义要使用哪些动画片段,并控制何时以及如何在它们之间进行混合和转换。

    调节器

    附加到这个角色的动画师控制器。

    阿凡达

    这个角色的阿凡达。(如果使用动画师来动画人物角色)

    应用根运动

    我们应该从动画本身还是从脚本控制角色的位置和旋转。

    更新模式

    这可以让您选择动画师更新的时间,以及应该使用的时间尺度。

            正常

    动画师与更新呼叫同步更新,动画师的速度与当前时间尺度相匹配。如果时间尺度减慢,动画将会减慢到匹配。

            物理动画

    动画与FixedUpdate调用同步更新(即与物理系统锁定步骤)。如果您使用物理交互来动画物体的运动,则可以使用此模式,例如可以推动刚体对象的人物。

            非标准时间

    动画器与更新调用同步更新,但是动画器的速度忽略了当前的时间尺度,并以100%的速度运行动画。这有助于在正常速度下对GUI系统进行动画,同时使用修改的时间点来进行特殊效果或者暂停游戏。

    剔除模式

    剔除模式,您可以选择动画。

            总是动画

    总是动画,即使在屏幕外也不要剔除。

            剔除变换更新

    当渲染器不可见时,重定位,IK和更新变换将被禁用。

            完全剔除

    当渲染器不可见时,动画被完全禁用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值