Animation
# Animation
动画剪辑是 Unity
动画的最小构成元素。它们代表了一个单独的运动,例如 RunLeft
、Jump
或 Crawl
,并且可通过各种方式进行操作和组合,从而产生生动的效果(请参阅动画状态机(Animation State Machines
)、Animator Controller
或混合树(Blend Trees
))。您可以从导入的 FBX
数据中选择动画剪辑。
Inspector 窗口的 Rig 选项卡包含四个区域:
- (A) 特定资源属性。这些设置定义了整个资源的导入选项。
- (B) 剪辑选择列表。您可以从此列表中选择任何项目以显示其属性并预览其动画。您也可以定义新的剪辑。
- (C) 特定剪辑属性。这些设置定义了所选动画剪辑的导入选项。
- (D) 动画预览。您可以在此处播放动画并选择特定帧。
# 属性
Import Constraints: 导入约束
Import Animation: 导入动画
# 特定于资源的属性
这些属性适用于此资源中定义的所有动画剪辑和约束:
# 属性
Import Constraints: 导入约束。
Import Animation: 导入动画。**注意:**如果禁用此选项,则会隐藏此页面上的所有其他选项,并且不会导入任何动画。
Bake Animations: 烘焙通过反向动力学 (
IK
) 或模拟 (Simulation
) 创建的动画以便推进运动关键帧。仅可用于Maya
、3ds Max
和Cinema 4D
文件。Resample Curves: 将动画曲线重新采样为四元数值,并为动画中的每个帧生成一个新的四元数关键帧。默认情况下会启用此选项。仅当原始动画中的关键点之间存在插值问题时,才应禁用此选项来保留最初创作的动画曲线。仅当导入文件包含欧拉曲线时才会显示此选项。
Anim. Compression: 导入动画时要使用的压缩类型。
Off: 禁用动画压缩。这意味着
Unity
不会在导入时减少关键帧数量,因此可产生最高精度的动画,但性能会降低、文件会更大、运行时内存大小将增加。通常建议不要使用此选项;如果需要更高精度的动画,应启用关键帧减少 (Keyframe Reduction
) 功能并减小允许的Animation Compression Error
值。Keyframe Reduction:导入时减少冗余关键帧。如果选择此选项,则会显示
Animation Compression Errors
选项。这会影响文件大小(运行时内存)以及如何计算曲线。Keyframe Reduction and Compression:导入时减少关键帧并在文件中存储动画时压缩关键帧。这仅影响文件大小;运行时内存大小与
Keyframe Reduction
相同。如果选择此选项,则会显示Animation Compression Errors
选项。Optimal: 让
Unity
决定如何进行压缩:通过减少关键帧还是通过使用密集格式。仅适用于Generic
和Humanoid
动画类型骨架。Animation Compression Errors: 仅当启用
Keyframe Reduction
或Optimal
压缩时可用。Rotation Error: 旋转曲线的减少量。该值越小,精度越高。
Position Error: 位置曲线的减少量。该值越小,精度越高。
Scale Error: 缩放曲线的减少量。该值越小,精度越高。
Animated Custom Properties: 导入您指定为自定义用户属性的任何
FBX
属性。Unity
在导入FBX
文件时仅支持一小部分属性(例如转换、旋转、缩放和可见性)。但是,您可以借助extraUserProperties
成员,在导入器脚本中指定标准FBX
属性(如用户属性)来处理这些属性。在导入期间,Unity
会将所有这些指定属性传递给资源后处理器 (Asset postprocessor
),就像“真实”用户属性一样。
# 欧拉曲线重新采样
3D 应用程序中的旋转通常表示为四元数或欧拉角。在大多数情况下,Unity
在内部将旋转表示为四元数;但是,大致了解 Unity 中的旋转和方向也是很重要的。
当导入外部动画文件时,导入后文件通常包含欧拉格式的关键帧动画。Unity
默认会将这些动画重新采样为四元数值,并为动画中的每一帧生成一个新的四元数关键帧。这样就最大限度减小了源动画与 Unity 中显示的动画之间的差异。
在某些情况下,即使重新采样,导入的动画的四元数表现也可能与原资源有所差异。因此,Unity 提供了关闭动画重新采样的选项。这意味着您可以在运行时改用原始的欧拉动画关键帧。
注意:仅当帧之间的默认四元数插值产生不良结果并导致问题时,才使用欧拉曲线。
# 保持导入动画上的原始欧拉曲线
要使用动画文件中的原始欧拉曲线值,请取消选中 Animation
选项卡中的 Resample Curves 选项:
禁用此选项时,Unity会根据曲线类型在欧拉或四元数模式下,将旋转曲线与其原始关键帧保持一致。
注意:FBX SDK
会自动重新采样旋转前或旋转后的关节上的任何旋转曲线。这意味着 Unity 会自动将它们导入为四元数曲线。
Unity
支持各种各样的导入文件,并会尝试使导入的曲线尽可能接近原始曲线。为了实现这一点,Unity
支持所有正常(非重复)欧拉旋转顺序,并以原始旋转顺序导入曲线。
# 欧拉值和 Unity 引擎
使用原始欧拉(非重新采样)旋转时,您可以看到动画播放中有非常小的视觉差异。在后台,Unity
甚至会在运行时以欧拉表示形式存储这些曲线。但是,Unity
最终必须将旋转值转换为四元数,因为引擎仅支持四元数。
禁用 Resample Curves
选项后,Unity
会将旋转值保持为欧拉值,直到将这些值应用于某个游戏对象为止。这意味着最终结果看起来应该与原始情况一样好,但内存有所改善,因为尚未在制作软件中烘焙的旋转曲线占用的内存较少。
# Transform Inspector 中的非默认欧拉顺序
默认情况下,Unity 按 Z
、X
、Y
顺序应用 Transform Inspector
中出现的欧拉角。
当播放或编辑导入的动画时,如果这些动画的欧拉曲线的旋转顺序与 Unity
的默认值不同,则 Unity
会在旋转 (Rotation
) 字段旁边显示一个差异指示符:
编辑不同旋转顺序的多个变换时,Unity 会显示一条警告消息,指出应用相同的欧拉旋转会在不同旋转顺序的曲线上得出不同的结果:
# 提取动画剪辑
动画角色通常具有许多不同的动作,这些动作在游戏中的不同情况下激活,也称为动画剪辑 (Animation Clips)。例如,我们可能有单独用于行走、奔跑、跳跃、投掷和死亡的动画剪辑。根据美术师在 3D 建模应用程序中设置动画的方式,这些单独的动作可以作为不同的动画剪辑导入,也可以作为单个剪辑导入(每个动作紧跟前一个动作)。如果只有一个长剪辑,可以在 Unity 中提取组件动画剪辑,为此需要在工作流程中增加一些额外的步骤。
如果模型有多段已定义为单个剪辑的动画,则 Animations
选项卡如下所示:
可以预览列表中显示的任何剪辑。如果需要,可编辑剪辑的时间范围,如果模型将多段动画作为一个连续片段提供,则 Animation
选项卡如下所示:
在这种情况下,可以定义与每个单独动画序列(行走、跳跃、奔跑和空闲)相对应的时间范围(帧数或秒数)。可按以下步骤创建新的动画剪辑:
- 单击添加 (+) 按钮。2.选择剪辑包含的帧数或秒数范围。3.还可更改剪辑的名称。
例如,可定义:
介于 0 - 83 帧之间的空闲动画,
介于 84 - 192 帧之间的跳跃动画
介于 193 - 233 帧之间的轻微摆臂动画
# 使用多个模型文件来导入动画
导入动画的另一种方法是遵循 Unity
支持的动画文件命名方案。可以创建多个单独的模型文件,并以 modelName@animationName.fbx
命名约定为文件命名。例如,如果一个模型名为 goober
,则可使用名为 goober@idle.fbx
、goober@walk.fbx
、goober@jump.fbx
和 goober@walljump.fbx
的文件导入单独的 idle
、walk
、jump
和 walljump
动画。导出此类动画时,不必在这些文件中包含网格,但这种情况下应启用 Preserve Hierarchy Model 导入选项。
Unity 会自动导入所有四个文件,并将所有动画汇集到不含 @
符号的文件。在上面的示例中,Unity
将自动导入引用 idle
、jump
、walk
和 wallJump
动画的 goober.mb
文件。
对于 FBX
文件,可将网格导出到不含动画的模型文件中。然后,通过导出每个剪辑的所需关键帧(在 FBX
对话框中启用动画),将四个剪辑导出为 goober@_animname_.fbx
。
# 动画剪辑上的循环优化
动画处理人员经常执行的一种操作是确保动画正确循环。例如,角色沿着一条路径行走,行走动作来自动画剪辑。动作可能仅持续 10 帧,但该动作以连续循环方式播放。为了使行走动作无缝衔接,它必须以类似的姿势开始和结束。这样可确保没有脚滑动作或奇怪的颠簸动作。
动画剪辑可根据姿势、旋转和位置进行循环。根据行走周期的示例,希望根变换旋转 (Root Transform Rotation
) 和 Y 方向根变换位置 (Root Transform Position
) 的起点和终点匹配。不希望 XZ 方向根变换位置的起点和终点匹配,因为如果角色的双脚持续恢复水平姿势,角色将永远到不了任何地方。
Unity
在 Animation
选项卡上的剪辑特定导入设置下提供了一些匹配标记和一组特殊的循环优化图。它们提供了视觉提示,可帮助对动作每个值进行剪辑优化。
要优化循环动作是否以最佳方式开始和结束,可以查看
和编辑
循环匹配曲线。
# 查看循环优化图
在以下示例中,循环动作显示剪辑范围内的匹配不佳(由红色和黄色标记显示):
要查看循环优化图,请单击并按住时间轴上的开始或结束标记。随后,Based Upon
和 Offset
值将消失,而每个循环基础位置将显示一条曲线:
# 优化循环匹配
单击并拖动动画剪辑的起点或终点,直到该点显示在图上属性为绿色的位置。Unity
将图绘制为绿色的情况下,剪辑更有可能正确循环。
松开鼠标按钮时,图会消失,但标记仍然存在:
# 曲线
可以在 Animation
选项卡中将动画曲线附加到导入的动画剪辑。
可以使用这些曲线将其他动画数据添加到导入的剪辑。可以根据animator
的状态,使用该数据来动画化其他项的时序。例如,在冰冷环境的游戏中,可以使用额外的动画曲线来控制粒子系统的发射速率,以显示玩家在冷空气中的冷凝呼吸。
要向导入的动画添加曲线,请展开 Animation
选项卡底部的 Curves
部分,然后单击加号图标以向当前动画剪辑添加新曲线
如果导入的动画文件被拆分为多个动画剪辑,则每个剪辑都可以拥有自己的自定义曲线。
曲线的 X
轴表示标准化时间,范围始终在 0.0
和 1.0
之间(无论持续时间如何,均分别对应于动画剪辑的开头和结尾)。
双击动画曲线将显示标准 Unity
曲线编辑器,可以使用该编辑器向曲线添加关键点。关键点(Keys
)是沿着曲线时间轴上的点,其具有 animator
明确设置的值,而不是仅使用插值。关键点(Keys
)非常适合用于沿着动画时间轴标记重要的点。例如,对于行走动画,可以使用关键点来标记左脚在地面上的位置点,然后是双脚在地面上的位置点,右脚在地面上的位置点,依此类推。设置好关键点后,通过按 Previous Key Frame
和 Next Key Frame
按钮即可方便地在关键帧之间移动。这样就会移动垂直的红线并显示关键帧的标准化时间。在文本框中输入的值将在此时间驱动曲线值。
# 动画曲线和 Animator Controller 参数
如果一条曲线的名称与 Animator Controller
中的某个参数同名,则该参数的值将取自这条曲线在时间轴中每个点的值。例如,如果从脚本调用 GetFloat
,则返回的值等于进行调用时的曲线值。请注意,在任何给定的时间点,可能有多个动画剪辑试图设置同一控制器中的同一参数。在这种情况下,Unity
会混合多个动画剪辑中的曲线值。如果动画没有特定参数对应的曲线,则 Unity
将与该参数的默认值混合。
# 事件
可以在 Animation
选项卡中将动画事件附加到导入的动画剪辑。
通过事件可以向导入的剪辑添加其他数据,从而确定何时应该在动画中触发某些动作。例如,您可能希望添加事件去指示一个动画角色在行走和运动周期中,应该何时播放脚步声。
要向导入的动画添加事件,请展开 Events 部分以显示导入的动画剪辑的事件时间轴:
要将播放头移动到时间轴中的其他位置,请使用窗口预览面板中的时间轴:
将播放头置于要添加事件的位置,然后单击 Add Event
。随后将出现一个新事件,由时间轴上的白色小标记指示。在 Function
属性中,填写要在发生事件时调用的函数的名称。
确保在其animator
中使用此动画的任何游戏对象都附加了相应的脚本,其中包含具有匹配事件名称的函数。
下面的示例演示了一个事件会调用附加到玩家游戏对象的脚本中的 Footstep
函数。此事件可与音频源结合用于播放与动画同步的脚步声。
还可以选择指定一个参数以发送到事件调用的函数。共有四种不同的参数类型:Float
、Int
、String
或 Object
。
通过填写其中任何字段的值,并实现接受该类型参数的函数,即可将事件中指定的值传递给脚本中的函数。
# 遮罩
通过遮罩功能可以丢弃剪辑中的一些动画数据,从而让剪辑仅动画化对象或角色的某些部分而不是整体。例如,如果有一个带有投掷动画的角色,现在希望能够将投掷动画与各种其他身体动作(如奔跑、蹲伏和跳跃)结合使用,则可以为投掷动画创建一个遮罩,使其局限于右臂、上半身和头部。然后,动画的这一部分可在基本奔跑或跳跃动画的上一层播放。
遮罩可应用于您的构建,使文件大小和内存更小。此外还可以提高处理速度,因为在运行时混合的动画数据更少。在某些情况下,导入遮罩可能对您不适用。在这种情况下,可使用 Animator Controller
的层设置在运行时应用遮罩。本页面与导入设置中的遮罩有关。
要将遮罩应用于导入的动画剪辑,请展开 Mask
标题以显示 Mask
选项。打开该菜单时,您将看到三个选项:Definition
、Humanoid
和 Transform
。
# Definition
在此处可以指定是否要在 Inspector
中专门为此剪辑创建一次性遮罩,或者是否要使用项目中的现有遮罩资源。
如果希望仅为此剪辑创建一次性遮罩,需要选择Create From This Model, 如果希望多个剪辑使用相同的遮罩,则应选择Copy From Other Mask并使用遮罩资源。这样即可对多个剪辑重复使用同一个遮罩定义。
选择 Copy From Other Mask 时,Humanoid 和 Transform 选项不可用,因为这些选项仅与在此剪辑的 Inspector
中创建一次性遮罩有关。
# Humanoid
Humanoid
选项可让您选择或取消选择人体图的身体部位,从而快速定义遮罩。如果已将动画标记为人形并具有有效的 Avatar
,则可以使用此类选项。
# Transform
使用此选项可根据各个骨骼或动画的移动部件来指定遮罩。这样可以更精确地控制确切的遮罩定义,还可以将遮罩应用于非人形动画剪辑。
# 运动
当导入的动画剪辑包含根运动时,Unity
会使用该运动来驱动正在播放动画的游戏对象的移动和旋转。但是,有时可能需要手动选择动画文件层级视图中的其他特定节点作为根运动节点。
借助动画导入设置中的 Motion
字段,可以使用层级弹出菜单来选择位于导入动画层级视图中的任何节点 (Transform
) 并将其用作根运动源。该对象的动画位置和旋转可驱动播放动画的游戏对象的动画位置和旋转。
要选择动画的根运动节点,请展开 Motion
部分以显示 Root Motion Node
菜单。打开该菜单时会显示导入文件层级视图根目录中的所有对象,包括 None
和 Root Transform
。这些对象可能包括角色的网格对象及其根骨骼名称,可能还包括具有子对象的每个项目的子菜单。每个子菜单还包含子对象本身,如果这些对象也具有子对象,还会包含进一步的子菜单。
选择根运动节点后,对象的动画将驱动其运动。