Unity-动画(Animation)

在Unity中使用动画·

在 Unity 中使用两种主要类型的动画:

  • 从其他程序导入的动画
  • 在编辑器本身中创建的动画

动画器(Animator·

Animator 播放由 Controller 分配并要求播放的动画。我们可以通过脚本中的 Animator 将数据发送到 Controller,从而根据游戏过程来选择正确的动画!

使用动画器控制动画 - Unity 学习

Animator组件·

  • 控制器
  • Avatar
  • 应用根运动(Root Motion)
    选择从动画本身还是从脚本控制角色的位置和旋转。
  • 更新模式
    • 正常(Normal)
      Animator 与 Update 调用同步更新,Animator 的速度与当前时间标度匹配。
    • 物理化(Animate Physics)
      Animator 与 FixedUpdate 调用同步更新。如果要对具有物理交互的对象(例如可四处推动刚体对象的角色)的运动进行动画化,应使用此模式。
    • 禁用时间缩放(Unscaled Time)
      Animator 与 Update 调用同步更新,但是 Animator 的速度忽略当前时间标度而不顾一切以 100% 速度进行动画化。此选项可用于以正常速度对 GUI 系统进行动画化,同时将修改的时间标度用于特效或暂停游戏。
  • 剔除模式
    • Always Animate
      始终进行动画化,即使在屏幕外也不要剔除。
    • Cull Update Transforms
      不在屏幕内时,禁用变换组件的重定向、IK(反向动力学)和写入。
    • Cull Completely
      不在屏幕内时,完全禁用动画。

应用根运动(Root Motion)·

选择从动画本身还是从脚本控制角色的位置和旋转。

脚本通过OnAnimatorMove()方法和使用Animator.deltaPosition、Animator.deltaRotation控制。

【Unity动画系统详解 十五】Unity中Root Motion的核心机制(勾选Animator组件中的Apply Root Motion后到底发生了什么)_哔哩哔哩_bilibili

动画控制器(Animator Controller)·

Controller 存储的状态机定义这些动画之间的关系。

动画状态机(State Machine·

动画状态机以图形方式显示动画的所有状态以及如何从一段动画过渡到另一段动画。

动画层(Layers·

Layers 可用于 3D 动画,因为你可以将动画用于角色的不同部分。Unity 使用__动画层__来管理不同身体部位的复杂状态机。相应的示例为:您有一个用于行走/跳跃的下身层,还有一个用于投掷物体/射击的上身层。

动画参数(Parameters·

动画参数是在 Animator Controller 中定义的变量,可从脚本访问这些变量并向其赋值。这是脚本控制或影响状态机流程的方法。

动画状态·

动画状态是动画状态机的基本构建块。每个状态都包含一个动画序列(或混合树),当角色处于该状态时播放。

属性: 描述:
动作 指定给此状态的动画剪辑或混合树。
速度 此状态的默认运动速度。启用参数以使用脚本中的自定义值修改速度。例如,您可以将速度与自定义值相乘,以减速或加快播放速度。
动作时间 用于播放此状态的动作的时间。启用参数以使用脚本中的自定义值控制动作时间。
镜像 此属性仅适用于具有人形动画的状态。启用此选项可镜像此状态的动画。启用参数以启用或禁用脚本镜像。
周期偏移 X 偏移量添加到运动的状态时间。此偏移不会影响运动时间。启用参数以指定脚本的周期偏移。
Foot IK 此属性仅适用于具有人形动画的状态。启用以尊重此状态的 Foot IK。
写入默认值 是否写入默认的动画状态。
转换 源自此状态的转换列表。

任意状态(Any State)·

任意状态是一个永远存在的特殊状态。当无论你当前处于哪种状态时,都想要进入某一个特定状态的情况,可以使用这种特殊状态。

这是将相同的向外转换添加到计算机中所有状态的简写方法。请注意,任何状态的特殊含义意味着它不能是过渡的终点(即,无法主动过渡到“任意状态(Any State)”)。

应用:无论角色处于什么状态,都能发动攻击,开始播放攻击动画。

混合树·

混合树允许你根据参数来混合多段动画。
使用混合树

动画过渡(Animation transitions·

动画过渡允许状态机从一个动画状态切换或混合到另一动画状态。过渡不仅定义状态之间的混合应该耗费多长时间,而且还定义它们应该在什么条件下激活。您可以设置仅在特定条件成立时才发生过渡。

案例 - 精灵动画

属性·

属性 英文 功能
有退出时间 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。这样可确保在动画的特定部分中进行过渡。

有退出时间(Has Exit Time) 若为取消选中状态,这表示 Moving 动画不会等到状态机进入到 Idle 动画之前结束,而是会立即发生变化。

Conditions - 条件·

在两种情况下会发生过渡:

  • 如果没有条件,则在动画结束时发生过渡。此处不属于这种情况,因为我们的动画正在循环播放,但是如果你查看从 Hit 到 Idle 的过渡,就属于这种情况:已勾选 Has Exit Time,并且没有设置任何条件,这意味着 Hit 动画将播放一次,然后过渡回 Idle。
  • 或者,我们可以根据你的参数设置条件。在此处,如果 Ruby 的速度小于 0.1,则状态机将从 Moving 过渡到 Idle。

过渡中断(Transition Interruption·

过渡中断解释 - 官方技术博客

【Unity动画系统详解 十二】动画状态过渡中断/转换打断(Transition Interruption)

使用 Interruption SourceOrdered Interruption 属性可控制如何中断过渡。

在概念上,中断顺序就像这些过渡已排队,然后解析为一个有效过渡从第一个过渡插入到最后一个过渡。

动画(Animation)·

使用 Animation 视图 - Unity 手册

  • 帧模式
  • 秒模式

Unity 动画的帧速率 (FPS)

默认情况下,Unity 动画的帧速率 (FPS) 为 60。这意味着对于每一秒的动画,屏幕上渲染 60 帧。这会产生非常流畅的动画;但是,动画更常见的帧速率是 24 FPS。这也是大多数电影的帧速率。您选择用于动画的帧速率最终取决于个人喜好,但请确保在项目中的所有动画中始终使用相同的速率。如果您打算使用从 DCC 或 Unity 资源商店导入的动画(通常为 24 FPS)。

注意:了解采样率低于每秒 60 帧的动画在时间轴中的数字显示方式非常重要。冒号之前的第一个数字是动画的第二个数字,而冒号后面的数字是当前帧。例如,1:22 表示第一秒内动画的第 22 帧

Animation Clip - 动画剪辑·

动画剪辑是用于存储动画数据的资源。

创建新动画剪辑 - Unity 手册

录制关键帧·

  1. 在动画窗口中,手动添加需要动画化的属性
  2. 层次窗口,选择游戏对象的子对象,在需要动画化的属性上,右键,添加关键帧(Key)

热键·

  • K - *为所有动画属性添加关键帧。*在 Animation 窗口回放头的当前位置为所有动画属性添加关键帧。
  • Shift-K - *为所有已修改属性添加关键帧。*在 Animation 窗口回放头的当前位置仅为已修改的动画属性添加关键帧。

曲线编辑器·

使用动画曲线 - Unity 手册

编辑曲线 - Unity 手册

在曲线视图中导航·

  • F 来完全框选显示的曲线或选定的关键点。
  • 按住 Alt 键 +(鼠标滚轮、触控板缩放或者鼠标右键拖动)来__缩放__曲线视图。
  • 按住 Ctrl 键,水平缩放。
  • 按住 Shift 键,垂直缩放。
  • 鼠标中键拖动,或按住 Alt 键 + 鼠标左键,来__平移__曲线视图。

编辑切线·

一个关键点有两条__切线__:左切线、右切线。切线可控制关键点之间的曲线形状。

切线类型·

用于控制曲线离开一个关键点并到达下一个关键点的方式。右键单击一个关键点可以选择该关键点的切线类型。

  • 自动钳制(Clamped Auto):这是默认切线模式。系统会自动设置切线,使曲线通过关键点时保持平滑。编辑关键点的位置或时间时,切线会进行调整以防止曲线“超出”目标值。如果在 Clamped Auto 模式下手动调整关键点的切线,则会切换到 Free Smooth 模式。
  • 自动(Auto):这是旧版切线模式,但此选项仍然保留着以便与旧项目向后兼容。除非有特别原因要使用此模式,否则请使用默认的 Clamped Auto。当关键点设置为此模式时,系统会自动设置切线,使曲线通过关键点时保持平滑。但是,与 Clamped Auto 模式相比有两个不同之处: 1.当编辑关键点的位置或时间时,切线不会自动调整;切线仅在最初将关键点设置为此模式时进行调整。 2.Unity 在计算切线时,不会考虑避免“超出”关键点的目标值。
  • 自动平滑(Free Smooth):拖动切线控制柄来自由设置切线。它们被锁定为共线以确保平滑。
  • 水平(Flat):切线设置为水平(这是 Free Smooth 的特例)。
  • 断开(Broken):使用中断的切线时,可以单独设置左右切线。拖动切线控制柄来自由设置切线。
    • 左切线
      • 自由曲线
      • 线性曲线
      • 恒定曲线
      • 加权曲线
    • 右切线
      • 自由曲线
      • 线性曲线
      • 恒定曲线
    • 双切线
      • 自由曲线
      • 线性曲线
      • 恒定曲线
      • 加权曲线

AnimationEvent - 动画事件·

动画事件允许您在时间轴中的指定点调用对象脚本中的函数

并不是所有的函数都可以被当做动画事件函数的,可以被调用的动画事件函数必须满足以下规则:

  1. 最多只能接受一个参数
  2. 参数的类型必须是float、string、int 、 object 引用、 AnimationEvent 对象

AnimationEvent 对象具有一些成员变量,通过这些变量可将浮点、字符串、整数和对象引用以及有关触发函数调用的事件的其他信息一次性传递给该函数。

参考资料:Unity/Animation – 添加动画事件(Animation Events)

2D Animation包·

官方文档:com.unity.2d.animation@7.0

在“包管理器”窗口中,找到“2D Animation”包,然后安装2D Animation包。

精灵皮肤组件 - Sprite Skin·

蒙皮编辑器 - Skinning Editor·

案例 - 使用 2D 动画包绑定精灵

官方文档 - 编辑器工具和快捷方式

在Sprite编辑器的下拉列表中,可以找到并打开。

蒙皮编辑器用于构建一个骨架,角色绑定到该骨架上。Sprite充当一种皮肤,因此蒙皮编辑器得名。蒙皮编辑器是Sprite编辑器的子集。

姿态工具·

  • 预览姿势(Preview Pose):这允许您移动和旋转骨骼,以查看绑定如何影响姿势和动画。您可以连接、断开和重新定位骨骼,但这些更改不是永久性的,仅在预览期间处于活动状态。
  • 重置姿态

骨骼工具·

  • 编辑骨骼(Edit Bone):将骨骼重新定位到新位置。这些更改将自动保存为“恢复绑定姿势”工具的默认绑定姿势。在此模式下,精灵几何体不会随骨骼变形,即使骨骼作为影响因素附加也是如此。

  • 创建骨骼(Create Bone):这允许您创建骨骼。如果要从另一个工具切换到此工具,则骨骼默认为先前所选骨骼链根的子项,从而在层次结构中启动一个新分支。或者,您可以单击现有骨骼的尖端,使其成为新骨骼的父骨骼。如果要在没有父骨骼的情况下创建新骨骼,请右键单击以断开任何连接。左键单击以放置骨根,然后再次单击以放置尖端。创建骨骼时,您可以为其命名并设置其精灵深度。

  • 分割骨骼(Split Bone):这会将单个骨骼拆分为两个连接的骨骼。

几何体·

  • 自动几何体(Auto Geometry):这会自动为精灵创建顶点网格体,将现有骨骼分配给顶点,并生成骨骼权重信息。骨骼权重是按顶点设置的,并确定骨骼对顶点的影响程度。顶点的颜色与受其影响的骨骼相匹配,受多个骨骼影响的顶点是骨骼颜色的混合。顶点网格体的细分是自动的,基于精灵几何轮廓,而不是骨骼的计数和位置。
  • 编辑几何(Edit Geometry):这允许您移动和删除边和顶点。如果删除边框边缘,导致网格打开,Unity 仅保留顶点和其他边框边缘。内部边缘信息将丢失,直到再次闭合曲面或使用“自动几何图形”。
  • 创建顶点(Create Vertex):这允许您创建顶点,自动创建边以将其连接到相邻顶点。
  • 创建边(Create Edge):这允许您在两个现有折点之间创建边,或者创建一个现有折点和放置在您单击位置的新折点之间创建边。
  • 分割边缘(Split Edge):这将拆分离鼠标最近的边缘,方法是在您单击的位置创建一个新顶点,并将其与原始边缘的两个端点连接起来。

权重·

  • 自动权重:这将打开一个面板,可以自动生成、归一化或清除骨骼重量。

  • 权重滑块:可以通过一组滑块调整选定的顶点。通过单击它们一次选择一个顶点,也可以在按住 Ctrl 并单击鼠标左键的同时选择多个顶点。您还可以通过在所需顶点周围拖动矩形套索来选择组。按住 Shift,您可以拖动其他套索以添加到您的选择中。在不按住 Shift 的情况下拖动套索可快速清除您的选择。

  • 权重刷子:这允许您选择骨骼并使用传统的数字画笔绘制其影响区域。画笔大小、硬度和步进就像在 Photoshop 等绘画程序中一样工作。

  • 骨骼影响(Bone Influence):选择影响精灵的骨骼。

  • 精灵影响(Sprite Influence):选择哪些精灵受到骨骼的影响。

工作流程·

使用Unity的骨骼系统·

  1. 导入精灵
  2. 编辑精灵设置
  3. 打开蒙皮编辑器
  4. 创建骨骼
  5. 创建几何体
  6. 配置权重
  7. 创建游戏对象
  8. 添加Sprite Skin组件
  9. 点击“创建骨骼”
  10. 制作骨骼动画

使用 2D 动画包制作精灵动画 - Unity 学习

导入动画·

配置动画类型·

导入动画 - 配置动画类型

  • 旧版
  • 泛型
  • 人形

配置动画剪辑·

导入动画 - 配置动画剪辑

  1. 新增剪辑
  2. 重命名
  3. 为特定动作定义开始帧和结束帧
  4. 是否动画循环
  5. 消除滑动效应
    在根变换旋转、根变换位置 (Y) 和根变换位置 (XZ) 中启用烘焙成的动作选项
  6. 现在,可以将剪辑从项目中添加到动画器中了。

根运动·

人形动画·

导入带有人形动画的模型 - Unity 手册 (unity3d.com)

重定向人形动画 - Unity 手册 (unity3d.com)

重定向只适用于已配置了 Avatar 的人形模型,因为这可以让我们在模型的骨骼结构之间建立对应关系。

人形Avatar - Unity 手册 (unity3d.com)

性能优化·

动画系统的性能和优化 - Unity 手册 (unity3d.com)