# 前言

主要来源于官方英文文档:Timeline|1.8.2
借助翻译软件,一边看一边整理和翻译。

注 1:由于在过程中...Unity 官方文档竟然突然更新到了 1.8.3,而 1.8.3 文档完全跟 1.8.2 排版大变了模样,所以可能会有些不对劲的
注 2:不是全按照官方文档来的,而是记录的个人认为的重点

# 概览

使用 Unity Timeline 创建的每个过场动画、电影或游戏序列都包含一个 TimelineAssets ,将 TimelineAssets 与 PlayableDirector 组件相关联会创建一个时间轴实例,并允许指定场景中的哪些对象由这个 TimelineAssets 进行操作
在选中某个对象创建新的 TimelineAssets 时,Timeline 编辑器会保存以下内容:

  1. TimelineAsset:存储轨道、剪辑和录制的动画,但不链接到正在动画的特定游戏对象。TimelineAssets 被保存到项目中。
  2. TimelineInstance:存储指向正在动画化或受 Timeline 影响的特定游戏对象的链接,这些链接(称为绑定)被保存到场景中。

要在场景中使用 TimelineAsset,需要使用 PlayableDirector 组件将 TimelineAsset 与游戏对象相关联,关联后会创建一个 TimelineInstance,并允许指定场景中的哪些对象由 TimelineAsset 设置动画 (如果想要为 GameObject 设置动画,它还必须有一个 Animator 组件)

  • 注:使用 Timeline 编辑器直接创建时,会自动给对象添加 PlayableDirector 并与对应 TimelineAsset 绑定

# Timeline Asset

Timeline 编辑器将轨道和剪辑定义保存为 TimelineAsset。如果在创建电影、过场动画或游戏序列时录制关键动画,Timeline 编辑器会将录制的剪辑保存为时间轴资产的子项。

根据 TimelineAsset Inspector 的 FrameRate 设置,帧将转换为秒或秒将转换为帧

# 主要属性

  • Frame Rate:参考帧速率
  • Duration Mode:选择 Timeline 的持续时间是延伸到最后一个片段的结尾还是在特定时间或帧结束。
    • Based On Clips:根据最后一个片段的结尾设置 Timeline 的长度
    • Fixed Length:将 Timeline 的长度设置为特定的秒数或帧数
  • Duration:显示基于秒数或帧数的长度(基于片段的情况下无法设置,只能预览)
  • Scene Preview:启用以预览 Timeline 对场景的影响,建议始终启用

# Timeline instance (实例)

要使用 TimelineAsset 为场景中的游戏对象设置动画,必须创建一个 TimelineInstance

  • TimelineInstance 通过 PlayableDirector 组件将 TimelineAsset 与场景中的 GameObject 相关联

当在具有 PlayableDirector 组件的场景中选择 GameObject 时,在 Timeline 窗口中即可看到 TimelineInstance 相关信息,例如绑定 (对象)—— 这个在 PlayableDirector 组件 (Inspector) 中也有显示。

如上图所示,PlayableDirector 组件 显示时间轴资产 (蓝框) 及其绑定的游戏对象 (红框),Timeline 界面 直接显示绑定对象 (红框)。

# PlayableDirector

PlayableDirector 组件存储 TimelineInstance 和 TimelineAsset 之间的链接。 并控制 Timeline 实例何时播放、更新其时钟以及完成播放时会发生什么。
主要属性

  • Playable:关联的 TimelineAsset
  • Update Method
    • Game Time:与游戏时间相同,受时间缩放影响
    • Unscaled Game Time:不受时间缩放的游戏时间
    • Manual:脚本手动更新
  • Play on Awake :是否自动播放,默认启用
  • Wrap Mode:播放结束时的行为
    • Hold:播放一次并保持在最后一帧直到播放中断。
    • Loop:重复播放,直到播放中断。
    • None:仅播放一次
  • Initial Time:开始播放的时间(以秒为单位),在 Timeline 际开始之前添加以秒为单位的延迟。
  • Current Time:运行时可见,当前 Timeline 实例已播放时间
  • Bindings:场景中游戏对象与关联 TimelineAsset(可播放)中的轨道之间的链接

# TimelineAssets 的重用

TimelineAssets 和 TimelineInstance 是分开的,所以可以对多个 TimelineInstance 重复使用相同的 TimelineAssets。

  • 因为 TimelineAssets 可重用,因此对其的修改会使所有使用这个 TimelineAssets 的 TimelineInstance 都发生变化。

在 Timeline 编辑器可以看到对应 TimelineInstance 的名字

# 嵌套 Timeline 实例

Timeline 支持嵌套 Timeline 实例

  • 嵌套 Timeline 实例是指添加在另一个 Timeline 中的 Timeline 实例。
  • 主 Timeline 实例是指包含其他 Timeline 实例 的 Timeline 实例。

通过使用嵌套的 Timeline 实例,可以让不同的人处理不同的动画,然后将这些动画组合到一个 Timeline 中
操作方式

  • 在场景中找到与要嵌套在主 Timeline 中的 Timeline 实例相关联的游戏对象 (PlayableDirector)
  • 将带 PlayableDirector 的 GameObject 拖到主 Timeline 窗口的剪辑视图中,会自动生成一个控制轨道

双击嵌套 Timeline 可以直接跳转至嵌套 Timeline,且标题也会有对应的显示:

注 1:嵌套 Timeline 的时间就是实际整个嵌套 Timeline 的总时长
注 2:如果发现嵌套 Timeline 的名称旁边会出现一个警告图标,则表示主 Timeline 播放时间超出嵌套 Timeline 的范围,并会自动禁用(如果不想自动禁用,可在嵌套 Timeline 上将 "Control Activation" 字段的勾去掉,这样会使嵌套 Timeline 在主 Timeline 的整个持续时间内处于活动状态)
注 3:"禁用" 是指关联 GameObject 都整个禁用了

# Local and Global

局部与全局时间基准,指嵌套 Timeline 的时间标尺

  • 全局时间是相对于主 Timeline 中 嵌套 Timeline 片段而言的。例如,全局标尺下,如果控制剪辑位于主 Timeline 的第 70 帧,则在嵌套 Timeline 时,时间轴标尺将从第 70 帧开始。

# 主界面

# 创建

从 Window->Sequencing > Timeline 打开
其中显示的信息与当前选中的与某个 TimelineAsset 关联的游戏对象有关

  • 即挂载了 PlayableDirector 并关联了 TimelineAsset 的 GameObject
  • 另外点击 TimelineAsset 也可以看到预览,不过只会显示与其关联的轨道和剪辑,不会有轨道绑定到场景中的游戏对象 (所以也不能播放)

注:TimelineInstance 保存 Timeline 与场景中的 GameObjects 绑定
在 Timeline 菜单上也可以直接根据相关名字选择场景中的所有 TimelineInstance。

# 编辑器设置

  • Playback Scrolling Mode:播放时,当前展示的界面是否跟随播放进度
    • None:不做自动滚动
    • Pan:当播放条到达可视区域的边缘时,内容视图会平移。
    • Smooth:内容视图滚动,同时将播放条保持在内容视图的中心,并平滑地滚动内容视图。
  • Snap to Frame:启用帧吸附,启用后拖动片段时,会自动吸附到对应每帧 (否则可能会是小数)
    • 注:吸附与设置的时间单位有关
  • Edge Snap:当定位、修剪和创建混合片段时,启用该选项后,将片段拖动到距离 10 像素以内时,片段的开头或结尾会对齐。

# 快捷操作

  • 按住鼠标中键拖动可以平移
  • F 键 聚焦功能在这里边也有效
  • A 键 或者未选择时按下 F 键,可以缩放显示至所有对象
  • 水平缩放可以使用 鼠标滚轮或 -、= 键
  • 垂直缩放通过按下 Ctrl + 鼠标滚轮 进行

# 平铺片段

  • 选中片段后,右键选择菜单 ->Tile,选中片段之间会直接相连放置不留间隙

# 拆分片段

  • 将一个片段拆分为两个

# 重置片段

  • 右键 ->Reset

# 场景预览选项

该选项打开后,可允许实时预览 Timeline 的控制操作,默认打开

启用 “场景预览” 选项可以预览 TimelineInstance 对场景的影响,并且处于启用时,Timeline 编辑器还会自动管理和保护场景及其场景数据。

  • 建议始终启用场景预览选项。

# 轨道 (Tracks)

其中,轨道头包含轨道的名称或其绑定信息

  • "轨道绑定" 即具体操作对象,保存在与 TimelineAsset 的游戏对象关联的 PlayableDirector 组件中
  • 这种关联也称为 TimelineInstance

每个轨道头都有一个颜色,可以标识轨道类型:

  • Activation tracks:绿色,在轨道生效时激活绑定对象,否则禁用绑定对象。
  • Animation tracks:蓝色
  • Audio tracks:橙色
  • Control tracks:青绿色,使用控制轨道添加 ControlClips,这些剪辑用于控制嵌套 TimelineInstance、粒子系统、预制体实例或 ITimeControl 脚本。ControlClips 的创建方式决定了它控制的内容。
  • Playable tracks:白色,每个 PlayableClip 都绑定到一个脚本,使用 Playables API 来创建自定义动画工具、效果或游戏机制
    • https://docs.unity3d.com/Manual/Playables.html

每个轨道头还有一个图标,如果轨道存在绑定错误或绑定的游戏对象被禁用,则代表轨道的图标将变为警告图标

# 轨道模式

Mix mode:混合模式;默认,允许两个动画重叠部分会进行混合
Ripple mode:这个模式下;拖动对象时会与与前一个对象末尾进行吸附,并且两者无法进行重叠操作
Replace mode:替换模式;这个模式下,若拖动的两个动画之间有重叠,处于下方的动画会被直接删除掉重叠部分

# 轨道操作

选择:支持 Shift 或 Ctrl 快捷键对轨道或轨道片段的选择
复制:可以复制轨道,不过若复制的轨道绑定到游戏对象,绑定将重置为空
删除:删除轨道操作是破坏性行为,会修改一个 TimelineAsset,并影响所有基于该 TimelineAsset 的 TimelineInstance
锁定:锁定轨道后可以避免被无意编辑
静音:暂时禁用该轨道功能

# 轨道排序及优先级

在 Timeline 界面中,优先级是从最后一个轨道到第一个轨道,其中最后一个轨道优先,可以重新排序轨道以更改其优先级。

  • 优先级主要是指:例如一个 Timeline 实例有四个动画轨道,其中第二个和第四个动画轨道为同一个游戏对象设置动画。那么第四条轨道覆盖前面任何轨道上的动画。此动画优先级也是动画覆盖轨道作为子轨道添加到动画轨道下的原因。

# 轨道组

可以使用轨道组来组织轨道,将同一类型的轨道组织在一起,避免过多轨道造成的混乱。

  • 选择 菜单 ->Track Group 可以创建一个新的轨道组
  • 一个轨道组也可以有任意数量的轨道子组 (嵌套)

# 轨道状态

具有源资引用的片段(例如动画片段或音频片段)会显示箭头,指示片段排除其部分源动画、音频波形或其他源内容。

  • 比如,如果动画片段仅使用其『源资源』完整动画的一部分,则白色箭头表示关键帧存在于片段开始之前或结束之后

# 动画

# 动画录制

# Infinite clip

可以直接将动画录制到动画轨道,当直接录制到一个空的动画轨道时,会创建一个『Infinite clip』

  • Infinite clip 是包含通过 Timeline 界面录制的基本关键动画的判断,其无法定位、修剪或拆分,因为它没有定义具体持续时间:相当于跨越整个动画轨道。
  • 在创建 Infinite clip 之前,必须先有一个空的动画轨道,单击空动画轨道的红色圆形录制按钮可启用录制模式

注:可直接将需要录制动画的对象拖到动画轨道目标上,Unity 会自动给它添加一个 Animator,后续操作跟 Animation 录制差不多(甚至可以双击 Infinite clip 点开 Animation 窗口)
保存 TimelineAsset 时,录制动画会作为子对象被保存在 TimelineAsset 中

# 转换为 Animation clip

在 Timeline 录制的 InfiniteClip 作为 TimelineAsset 的一部分保存在一块的
同时,由于 InfiniteClip 没有持续时间定义,因此也无法定位、修剪或拆分。如果想要对 Infiniteclip 进行这些剪辑操作,必须先将其转换为 AnimationClip

  • 注:这个操作是单向的,AnimationClip 无法再转换回 InfiniteClip

转换方式很简单:单击动画轨道,选择 "Convert to Clip Track" 即可

# 人形动画

直接将 AnimationClip 拖到 Timeline 动画轨道上即可,与之绑定的对象会自动跟着 Timeline 播放

# 位置跳跃

两个不同的 AnimationClip 会导致角色发生位置跳跃,这是两位两个 AnimationClip 之间,上一个结束点位置与下一个开始位置不匹配导致。

  • 若想修改位置跳跃问题,需要匹配每个 AnimationClip 的位置偏移。
  • Timeline 提供了两个选项:Match Offsets to Previous Clip 或 Match Offsets to Next Clip
  • 简单点击轨道上第二个 AnimationClip,然后选择 "Match Offsets to Previous Clip",Unity 会自动设置第二个动画片段的位置偏移。

同时,上述选项允许多选,以使可以同时设置

# 姿势跳跃

修复位置跳跃问题后,两个动画片段之间动画仍然会存在跳跃,因为人形处于不同的姿势
因此还需要进『混合』:

将后一个 AnimationClip 与前一个重叠,重叠区域即为混合动画,这样可以在两个动画之间创建平滑过渡

# 脚滑问题

动画混合后,可以消除两个动画衔接姿势之间的明显跳跃,大多数身体部位之间的过渡看起来应该会很自然,但也可能还会存在例外情况:

  • 比如脚的不同位置之间的混合而导致不自然的脚滑动

选中轨道上的 AnimationClip,点击 Animation Playable Asset->Clip Transform Offsets-> 方向按钮 即可预览,如图所示:

如果确实出现了这个情况,还可以通过手动调整 AnimationClip 的偏移量再修复一下,使脚的位置变化不那么剧烈

# 动画覆盖轨道及 Avatar Mask

可以使用 AnimationOverrideTrack (动画覆盖轨道) 和 AvatarMask 来组合动画轨道的上下半身动画
使用该技术可以制作人形动物的组合动画,如:抱着某个物体奔跑
创建方式

  1. 单击动画轨道,选择 "Add Override Track",一个动画覆盖轨道会链接到动画轨道
  2. 然后将新的动画拖到动画覆盖轨道上即可,不过此时覆盖轨道上的动画会完全覆盖原动画。要将一个 AnimationClip 的下半身动画与另一个 AnimationClip 的上半身动画相结合,需要为动画覆盖轨道指定一个 AvatarMask
  3. 点击覆盖轨道,Inspector 面板上就会显示相关设置
  4. 将对应 AvatarMask 拖上去即可

覆盖轨道上有设置对应的 AvatarMask 之后,就会显示一个 AvatarMask 图标,单击该图标可以启用 / 禁用 AvatarMask

# 主要属性

  • Clip Transform Offsets:两个动画片段位置和旋转匹配偏移
  • Offsets Match Fields:使用偏移匹配字段选择匹配偏移时要匹配的变换 (transforms),若关闭,则会有不同轴的旋转和位置进行设置
  • Remove Start Offset:启用使动画片段位置和旋转从零开始。若启用可以更轻松地将动画片段与之前的动画片段相匹配。
  • Foot IK:如果动画片段正在为人形动物制作动画并且想要使用反向运动学来解决足部问题,则启用;否则为非人形对象则禁用

# 动画间隙 (Gap extrapolation)

指在动画片段之间的间隙,该间隙由前后的两个动画片段进行推测,主要目的是避免动画异常。根据绑定到动画轨道的游戏对象,这些异常可能是在两个变换之间跳跃的游戏对象,或者是在不同姿势之间跳跃的人形动物。

  • Pre-Extrapolate:控制动画数据在动画剪辑之前的间隙中如何近似。
  • Post-Extrapolate:控制动画数据如何在动画剪辑之后的间隙中延伸。

例如,默认情况下为 Hold,即保持为前一个动画片段的最后一个动作

若前一个动画片段的 Post-Extrapolate 设置为 None,则处于间隙中则会保持为后一个动画判断的第一个动作

  • 某些情况下 Pre-Extrapolate 设置会被隐藏:比如前一个动画设置了 Post-Extrapolate 或者两个动画片段之间没有间隙

关于 Pre-Extrapolate 和 Post-Extrapolate 设置的具体选项:

  • None:关闭(例如想在场景中游戏对象的运动和动画剪辑之间创建缓入效果可以考虑)
  • Hold:固定姿势
  • Loop:循环播放 (会重置位置)
  • Ping Pong:来回播放
  • Continue:继续循环播放 (注:与 Loop 不一样的是该选项不会重置位置,而是以当前位置为准)

# 动画关键帧

每个关键帧都有切线可以控制,用于修改关键帧之间动画曲线的形状

  • 该切线默认是两条切线共同相连控制,也可以选择打断连接,使每条切线可以单独控制关键帧左边或右边曲线
  • 另外,切线还有一些平滑算法可以选择,右键即可选择

切线类型:切线类型可以更好地控制关键帧前后动画曲线的形状和斜率(关键帧之间动画曲线形状的插值算法)

# 操作

添加:右键 ->Add Key 或双击
选择:

  • 按住 Ctrl 键单击可以选取不连续的关键帧
  • 按住 Shift 键并单击 (或拖动) 关键帧可选择连续的关键帧
  • 单击空白位置取消选择

移动:按住 Shift 键,可以单纯在水平或垂直其中一个轴上对齐移动。

# 总结

总体来看,官方 Timeline 文档本身基本都是界面相关的内容,若是涉及代码,比如上文提到的 Playable tracks ,即自定义轨道,单独在另外一处:https://docs.unity3d.com/Manual/Playables.html

最近公司项目也比较忙,导致花费时间也有点超预期了,一个多星期才忙里偷闲把文档看完:

继续吧,后续是 URP 和 DOTS 的官方文档。