type
Post
status
Published
date
May 20, 2026 10:15 AM
slug
unity.timeline
summary
unity中Timeline的使用方式
tags
category
Unity
icon
password
Parent item
Sub-item

1. Timeline 概述

Timeline 是 Unity 内置的可视化序列编排工具,用于创建基于时间的过场动画、游戏事件和交互序列。它通过轨道(Track)组织不同类型的片段(Clip),可精确控制动画、音频、信号等内容。Timeline 基于 Playables API 构建,核心架构包含以下组件:Timeline Asset(时间轴资源文件)、Playable Director(播放控制器)、Track(轨道容器)和 Clip(剪辑片段)。

2. 核心架构

2.1 核心组件

组件名称
功能说明
关键作用
Timeline Asset
时间轴资源文件(.playable
存储所有轨道和剪辑数据
Playable Director
播放控制器组件
控制 Timeline 的播放、暂停、停止等操作
Track
轨道容器
承载不同类型的剪辑片段
Clip
剪辑片段
具体的动画、音效或事件单元
Binding
绑定关系
将轨道关联到场景中的实际游戏对象

2.2 常用轨道类型

  • Animation Track:控制物体动画(基于 Animator 或录制)
  • Audio Track:播放音效/音乐
  • Activation Track:控制物体激活/禁用
  • Control Track:控制其他 Timeline 或粒子系统
  • Signal Track:在特定时间发射信号,触发脚本逻辑
  • Playable Track:通用轨道,可放置自定义 Playable 片段

2.3 Playable Director

Playable Director 负责从 PlayableAsset 实例化 PlayableGraph 并控制播放,主要属性包括:
  • playableAsset:关联的 Timeline 资源
  • playOnAwake:是否在 Awake 时自动播放
  • extrapolationMode:播放结束后的行为(None/Loop/Hold)
  • time:当前播放时间(可读写)
  • state:当前播放状态(Paused/Playing)
  • initialTime:首次播放时的初始时间

3. 基础使用

3.1 创建与配置

步骤一:创建 Timeline 资产
在 Project 窗口中右键 → Create → Timeline,生成 .playable 资源文件。也可以直接在场景物体上通过 Timeline 窗口创建。
步骤二:配置 Playable Director
在场景中创建一个空 GameObject(建议命名为 "Timeline"),添加 Playable Director 组件,将 Timeline 资产拖入 playableAsset 字段。
步骤三:打开 Timeline 编辑器
双击 Timeline 资产或在 Window → Sequencing → Timeline 中打开 Timeline 窗口。选中带有 Playable Director 的 GameObject 后,Timeline 窗口会显示对应的时间轴。
步骤四:添加轨道并绑定
在 Timeline 窗口中右键 → 选择轨道类型 → 将场景物体拖入轨道进行绑定。然后在轨道上右键添加片段(Clip),并设置相关属性。

3.2 通过脚本创建与配置

3.3 动态创建 Timeline(纯代码)

4. 常用轨道详解

4.1 Animation Track(动画轨道)

用于控制带有 Animator 组件的物体的动画播放。支持录制关键帧动画和使用 Animation Clip。
录制模式:点击录制按钮后,直接在 Scene 视图中操作物体,关键帧会自动记录。
片段转换:右键轨道 → Convert To Clip Track,可将 Infinite Clip 转换为独立的 Animation Clip。
动画推断(Extrapolation)
  • Pre-Extrapolation:定义时间轴在片段开始前如何推断动画
    • None:不做任何操作
    • Hold:保持初始状态
    • Loop:循环播放
    • PingPong:来回播放
  • Post-Extrapolation:定义时间轴在片段结束后如何推断动画
动画混合:在 Mix 模式下,拖动和修剪片段可创建 Blend 过渡区域,实现动画间的平滑切换。选中片段后可自定义 Blend Curves(混合曲线),在下拉框中切换 Auto/Manual 模式来手动调整混合曲线。

4.2 Audio Track(音频轨道)

直接拖入音频文件即可创建音频片段。无需 Audio Source 组件也能播放。

4.3 Activation Track(激活轨道)

通过轨道控制物体的显隐(SetActive)。有 Clip 的部分表示激活,没有 Clip 的部分表示隐藏。

4.4 Control Track(控制轨道)

可控制其他 Timeline(嵌套子 Timeline)、粒子系统(ParticleSystem)以及实现了 ITimeControl 接口的脚本。
嵌套 Timeline:如果从带有 Playable Director 组件的 GameObject 创建 Control Clip,则该 Control Clip 将控制一个嵌套的 Timeline 实例。

4.5 Signal Track(信号轨道)

提供时间轴与脚本之间通信的能力,可在特定时间点触发自定义逻辑。
基础用法(内置信号系统)
  1. 创建 Signal Track 并绑定目标物体
  1. 在轨道上右键 → Add Signal Emitter 添加信号发射器
  1. 点击 Create Signal... 创建 Signal Asset
  1. 在目标物体上添加 Signal Receiver 组件
  1. 在 Signal Receiver 中配置信号对应的响应方法
信号轨道提供了时间轴之间以及与脚本进行通信的能力,可在特定时间点触发自定义逻辑。使用内置的 Signal Emitter 和 Signal Receiver 组件可以实现基本的信号发射与接收。

4.6 Playable Track(可播放轨道)

PlayableTrack 是一种轨道,其中的剪辑为自定义可播放项。这种轨道可以包含处于项目中并且没有自己的指定轨道类型的 PlayableAsset。适用于快速原型测试或简单自定义逻辑。

5. 信号系统与自定义事件

5.1 内置 Signal 系统

使用 Timeline 内置的 Signal Track 可添加 Signal Emitter,配合 Signal Receiver 组件在特定时刻调用方法。

5.2 自定义 Marker(带参数信号)

内置 Signal Emitter 无法直接传递参数。通过自定义 Marker 可以实现带参数的信号。
自定义信号接收器
自定义信号轨道

6. 脚本控制 Playable Director

6.1 基本播放控制

PlayableDirector 提供了完整的播放控制 API,支持 Play、Pause、Stop、Resume 等操作。

6.2 过场动画管理示例

6.3 程序化控制多个 Timeline

7. 自定义 Timeline 扩展

7.1 扩展架构概述

一套完整的 Timeline 扩展需要定义四个部分:
组件
基类
说明
Track(轨道)
TrackAsset
定义轨道类型和绑定
Clip(剪辑数据)
PlayableAsset + ITimelineClipAsset
存储剪辑的可序列化数据
Behaviour(行为逻辑)
PlayableBehaviour
定义剪辑运行时的行为
Mixer(混合器)
PlayableBehaviour
定义同轨道多个剪辑的混合逻辑
核心工作流程
  • Track 定义了轨道的基本属性,如可包含的 Clip 类型(TrackClipType)、绑定对象的类型(TrackBindingType)以及轨道颜色等元信息
  • Clip(PlayableAsset) 是可序列化的 ScriptableObject 子类,用于在编辑器中存储数据。它通过 CreatePlayable() 方法在运行时创建 PlayableBehaviour 实例
  • Behaviour 包含实际的运行逻辑,通过 ProcessFrame() 每帧执行,以及通过 OnBehaviourPlay/OnBehaviourPause 响应播放状态变化
  • Mixer 同样继承自 PlayableBehaviour,负责处理同一轨道上多个 Clip 之间的过渡混合。当两个 Clip 在时间上有重叠时,Mixer 会根据权重计算出最终结果

7.2 自定义 Clip(简单示例)

自定义 Clip 是扩展的最小单元。以下示例创建一个可在 Playable Track 上使用的自定义 Clip,每帧输出日志:
Step 1:定义 Behaviour(运行时行为)
Step 2:定义 Clip(可序列化数据)
创建完成后,在 Timeline 的 Playable Track 上右键即可看到 LogClip 选项,将其拖入轨道即可使用。
ClipCaps 选项说明
  • None:不支持任何高级特性
  • Blending:支持与其他 Clip 混合
  • Extrapolation:支持时间推断(Pre/Post-Extrapolation)
  • Looping:支持循环播放
  • SpeedMultiplier:支持变速播放
  • ClipIn:支持设置入点偏移

7.3 自定义 Track + Clip + Mixer(完整示例)

这是一个经典的 Transform Tween 示例,实现物体在两个位置之间的线性插值移动。
Step 1:定义 Behaviour
Step 2:定义 Clip(PlayableAsset)
Step 3:定义 Mixer(混合器)
混合器用于处理同一轨道上多个 Clip 之间的过渡。当两个 Clip 有重叠区域时,Mixer 会根据各 Clip 的权重计算最终结果。
Step 4:定义 Track
Track 常用属性说明
属性
说明
[TrackBindingType(typeof(T))]
指定轨道绑定的对象类型,决定了轨道上显示的对象选择器类型
[TrackClipType(typeof(T))]
指定关联的 Clip 类型。可以添加多个,支持右键菜单创建不同类型 Clip
[TrackColor(r, g, b)]
设置轨道颜色(0~1 范围)
[DisplayName("路径/名称")]
自定义轨道在创建菜单中的名称

7.4 扩展进阶:Time Dilation Track(时间膨胀轨道)

一个实用的自定义轨道示例,可创建慢动作/子弹时间效果。

7.5 自定义 Clip Inspector 编辑器

为自定义 Clip 创建 Inspector 面板,提供更好的编辑器体验:

8. PlayableGraph API 深入

Timeline 底层基于 PlayableGraph。通过 PlayableGraph API,可以在 Timeline 播放时动态地添加、移除或修改 Playable 节点,实现更复杂的逻辑控制。

9. Cinemachine 与 Timeline 集成

Cinemachine 与 Timeline 结合可创建复杂的摄像机序列,是过场动画的常见组合。结合 Cinemachine 的 Timeline,可直接在 Unity 中创建复杂的动画序列,涵盖镜头设置、动画、摄像机激活/停用、景深模糊等功能。

9.1 基础集成

9.2 使用 Cinemachine Shot Track

Cinemachine 包提供了专用的 Cinemachine Track(Shot Track),可直接在 Timeline 中添加:
  1. 确保已安装 Cinemachine 包(Window → Package Manager → Cinemachine)
  1. 在 Timeline 窗口中右键 → Cinemachine.Timeline → Cinemachine Track
  1. 将场景中的 CinemachineBrain 所在物体绑定到轨道
  1. 在轨道上添加不同的 Virtual Camera 作为 Shot Clip
  1. 通过混合区域实现镜头之间的平滑过渡

10. 最佳实践与技巧

10.1 性能优化

  1. 延迟初始化:在 OnBehaviourPlay 而非 ProcessFrame 中进行重操作
  1. 避免每帧查找:在 ProcessFrame 中避免使用 GameObject.FindGetComponent 等操作,利用 playerData 参数获取绑定对象
  1. 合理使用 ClipCaps:不需要混合的 Clip 设置 ClipCaps.None,减少不必要的混合开销
  1. 减少 Timeline 嵌套深度:深层嵌套会增加 Graph 采样开销
  1. PlayableGraph 复用:不要频繁创建和销毁 PlayableGraph,尽量复用已有的 Graph

10.2 调试技巧

  1. 使用 Debug.Log 配合 FrameData:在 ProcessFrame 中输出 info.frameId 了解帧序
  1. 利用 PlayableGraph Visualizer:Window → Analysis → PlayableGraph 可视化 Graph 结构
  1. 检查绑定:使用 director.GetGenericBinding() 验证轨道绑定状态
  1. 在 Editor 模式下使用 director.Evaluate():可拖动时间轴滑块预览效果,或在代码中调用 Evaluate() 立即采样

10.3 常见问题

问题
原因
解决方案
引用丢失
Clip 中直接使用 Transform 等场景引用
使用 ExposedReference<T>
混合效果异常
缺少 Mixer 或 Mixer 实现有误
检查 CreateTrackMixer 和权重计算
绑定失败
TrackBindingType 不匹配
确认轨道属性与绑定对象类型一致
信号未响应
缺少 Signal Receiver 或未实现 INotificationReceiver
确认接收器组件/接口
Timeline 不播放
PlayableDirector 未正确配置
检查 playableAsset 和 playOnAwake
动画位置被覆盖
其他脚本修改了 Transform
使用父级空物体偏移,或调整 Clip Offset

10.4 ExposedReference 使用注意事项

Timeline 作为资源文件不能直接引用场景对象。如果 Clip 中声明了 public Transform target,关闭场景后引用会丢失。解决方法是使用 ExposedReference<T>

11. 快速参考

11.1 常用 API

API
说明
director.Play()
从头播放 Timeline
director.Pause()
暂停
director.Resume()
从暂停处恢复
director.Stop()
停止并重置到起始时间
director.Evaluate()
立即采样当前时间
director.time
当前播放时间(秒)
director.duration
Timeline 总时长(秒)
director.state
当前播放状态
ScriptPlayable<T>.Create(graph)
创建 ScriptPlayable
playable.GetBehaviour<T>()
获取 PlayableBehaviour
graph.GetResolver()
获取 ExposedReference 解析器
director.GetGenericBinding(source)
获取轨道绑定对象
director.SetGenericBinding(source, obj)
设置轨道绑定对象

11.2 核心类继承关系

11.3 Timeline 窗口操作快捷键

快捷键
操作
鼠标滚轮
缩放时间轴
中键拖拽
平移时间轴视图
F
Frame 选中的 Clip
Space
播放/暂停预览
Delete
删除选中的 Clip 或轨道
Ctrl+Z / Cmd+Z
 
排序算法C#中的Span<T>
Loading...
琥珀
琥珀
一个普通的干饭人🍚
公告

🍕一切安好🍕