MENU

文章目录

• 2026 年 03 月 15 日 • 已有 4 只咪围观过 • -学海无涯-

以前都是处理资产标准化,遍历材质和相关param和refrence相关就可以,第一次接触Seq,还挺有意思。
但是因为后续多半是使用As来编写逻辑了,不会使用蓝图了,所以这个文档多半不会再更新。
学习思路和实际上的实现逻辑是接近的,一般节点和function能关联上,所以文档在Seq遍历的理解上上也有一定价值,作为一个存档吧。

And,我的网课开始了,没精力了...


Runtime 控制 vs Editor 编辑

你对 Sequence 的需求通常分两类:

Runtime(运行时)= “播放控制、动态替换绑定”

常见任务:

  • Play / Pause / Stop / Reverse / Loop
  • Jump/Seek 到某个时间或帧
  • 动态换绑定:同一段镜头,换角色/道具/相机(Rebinding)

这类通常用 LevelSequenceActor / LevelSequencePlayer 完成。

Editor(编辑器)= “改资产、做批处理”

常见任务:

  • 批量遍历 Content Browser 里选中的多个 Level Sequence
  • 修复丢失引用(Binding 断了)
  • 批量加 Track / Section
  • 批量打 Key / 改曲线
  • 批量 Bake/导出 AnimSequence

这类通常在 Editor Utility Widget(EUW) 或 Editor Utility Blueprint 里做,靠 Sequencer Scripting 提供的扩展库。


1. Sequencer 的数据结构:你到底在改什么?

把 Level Sequence 想成“时间轴资产”,它内部关键结构是一条链:

LevelSequence(资产)
MovieScene(根时间轴容器)
Object Bindings(对象绑定:这条轨控制谁)
Tracks(轨道:控制什么类型数据,如 Transform / CameraCut / Property)
Sections(片段:轨道上的时间区间)
Channels(通道:Transform.X 等)
Keys(关键帧:时间+值)

你做工具时,“编辑 Sequence”=
找到 Binding → 创建/修改 Track → 创建/修改 Section → 拿到 Channel → 写 Keys → 刷新 UI → 保存资产

这一篇知乎说的还蛮清楚的。

精髓就是这两张图。

图1

图2

当然我在实战的时候发现其实也是变化比较多的,需要自己去官方文档一点点推理。
比如这里设置相机就是很标准的上述流程,不管是蓝图还是As,都是这个层级这个套路。

图3

如果是As的话,大概是这样的,基本一样这里是修改相机Z轴,前面TargetZ已经定义过了:

    private bool TryUpdateCameraBindingTrackZ(FMovieSceneBindingProxy Binding, float TargetZ)
    {
        SetLogsText("[Step] Searching camera transform tracks");
        TArray<UMovieSceneTrack> Tracks = Binding.FindTracksByType(UMovieScene3DTransformTrack::StaticClass());
        SetLogsText(f"[Info] Transform track count: {Tracks.Num()}");
        bool bUpdated = false;
        int UpdatedChannelCount = 0;

        for (auto Track : Tracks)
        {
            if (Track == nullptr)
            {
                continue;
            }

            TArray<UMovieSceneSection> Sections = Track.GetSections();
            for (auto Section : Sections)
            {
                if (Section == nullptr)
                {
                    continue;
                }

                TArray<UMovieSceneScriptingChannel> Channels = Section.GetAllChannels();
                for (auto Channel : Channels)
                {
                    if (Channel == nullptr)
                    {
                        continue;
                    }

                    if (Channel.ChannelName == n"Location.Z")
                    {
                        if (ApplyTargetZToScriptingChannel(Channel, TargetZ))
                        {
                            bUpdated = true;
                            UpdatedChannelCount++;
                        }
                    }
                }
            }
        }

但是动画没有这个Channel。这一点感觉没有人特地说过..我做这个动画项目的时候搞了一下午才查到的..

因为普通属性和动画的保存方式不一样。普通属性,比如位置、旋转、颜色,是这样:

Track -> Section -> Channel

这些值是 Sequencer 自己存的,所以能看到 Channel。

动画,比如 Anim Sequence,是这样:

Track -> Section -> 动画资源

动画的骨骼关键帧保存在动画资源里,不在 Sequencer 的 Channel 里。

最后实现是这样的。

图4


2. 开工前的准备:插件、蓝图库、节点搜索关键词

2.1 建议启用的插件

  • Sequencer Scripting(强烈建议):提供 Sequence/Track/Section/Channel/Key 的脚本访问入口(Blueprint / Python 都能用)。
  • Editor Scripting Utilities:EUW 常用(选资产、存资产、日志/工具链)。
如果你发现“加轨/打 Key”相关节点搜不到,第一件事就是检查 Sequencer Scripting 是否启用。

2.2 你会高频用到的“入口库”

在蓝图里搜索这些关键词,能快速定位入口:

  • LevelSequenceEditor(编辑器上下文)

    • 获取当前 Sequencer 打开的 Sequence
    • 获取选中的绑定(bindings)
    • 刷新 Sequencer UI
  • MovieSceneExtensions(==结构编辑入口==)++这一块变化比较多,需要自己去理解++

    • MovieSceneSequenceExtensions(从 Sequence 取 bindings、添加轨、设置绑定等)
    • MovieSceneTrackExtensions(从 Track 取 sections 等)
    • MovieSceneSectionExtensionsMovieSceneChannelExtensions(获取 channels / keys / 添加 key 等)
  • SequencerTools(导出/烘焙一类的编辑器工具)

    • 例如 Export Anim Sequence

3. Part A:运行时用蓝图“操作”Sequence(播放/跳转/换绑定)

3.1 最常用:Create Level Sequence Player

典型流程:
1) Create Level Sequence Player(输入 Sequence 资产 + 播放设置)
2) 得到 LevelSequencePlayer
3) 调用 Play / Pause / Stop / SetPlaybackPosition

适合“临时播放某段 Sequence”。

3.2 跳转到某个时间/帧(Seek / Jump)

  • 如果你要求“镜头帧精确对齐”,尽量按 来思考(FrameNumber / FrameRate)。
  • 只需要粗略跳转,可用秒。

3.3 动态换绑定(Rebinding)

典型场景:

  • Sequence 里原本绑定的是一个关卡里的相机 A
  • 运行时你想用相机 B 来跑同一段 CameraCut / Transform
  • 或者角色是运行时 Spawn 的,你需要把轨道绑定到新角色

实现思路:

  • 找到需要替换的 Binding(用名字/Tag 更稳)
  • Override/Set Binding 为新 Actor(官方“Actor Rebinding”文档有完整流程)

4. Part B:编辑器用蓝图“编辑资产”Sequence(EUW 批处理主战场)

编辑器批处理的核心目标:“对资产本身做修改”,而不是“仅在运行时改播放对象”。
你会非常频繁遇到三件事:

1) 获取要处理的 Level Sequence 资产
2) 修改 bindings/tracks/keys
3) 刷新 UI + 保存资产(不然你会怀疑人生)

4.1 获取要处理的 Sequence:三种入口

方式 A:从 Content Browser 选中资产开始(最常见)

适合做“批量修改选中的多个 Sequence”。

方式 B:获取当前 Sequencer 打开的 Sequence(对当前序列一键修复)

适合做“我正在看这个序列,我要一键修复/一键加轨/一键打 key”。

方式 C:扫描某个目录下所有 Sequence(全库升级/修复)

适合做“我想把整个项目某类序列统一改一遍”。


5. 关键能力地图:Bindings / Tracks / Sections / Channels / Keys

下面这张“能力地图”建议你背下来:它决定了你写 EUW 是否能从 0 到 1。

5.1 Bindings:对象绑定(这条轨控制谁)

你常用的能力:

  • 列出 Sequence 的所有绑定(遍历)
  • 读取绑定的 Display Name / Binding ID
  • 获取这个绑定当前绑定了哪些对象(在编辑器里尤其关键)
  • 设置/替换绑定(修复引用、换角色、换相机)

5.2 Tracks:轨道(控制什么)

你常用的能力:

  • 给 Binding 添加某种 Track(Transform / Property / Parameter / CameraCut 等)
  • 读取 Track 下有哪些 Sections
  • 删除某些 Track 或合并结构(进阶)

5.3 Sections:片段(时间区间)

你常用的能力:

  • 设置 Section 的起止范围(start/end frame)
  • 获取 Section 的 Channels(例如 Transform 的 9 个 float 通道)

5.4 Channels / Keys:曲线与关键帧(核心编辑能力)

你常用的能力:

  • 在某个时间(帧)添加 key
  • 批量偏移/缩放时间
  • 批量改值
  • 删除 key(稀疏化、清理噪点)
一旦你能稳定做到“拿到 Channel 并写 Key”,Sequencer 就变成了“可编程时间轴”。

6. 实战 1:批量修复丢失引用(Missing Binding / Missing Actor)

6.1 问题长什么样?

你会看到:

  • Sequence 里轨道还在(CameraCut、Transform 都在)
  • 但提示 “The object bound to this track is missing” 一类信息
  • 播放时镜头/动画不动
    这通常说明:Binding 断了(原 Actor 被删/改名/换关卡/换层级)。

6.2 工具算法(稳定版)

输入: 一组 Level Sequence 资产 + 你的“匹配规则”
输出: 修复后的资产(binding 重新指向正确 Actor)

流程:
1) 对每个 Sequence:获取所有 bindings
2) 对每个 binding:检查“当前绑定对象列表”是否为空
3) 为空 → 说明断了
4) 用你的规则在关卡中找到目标 Actor(按 Name/Tag/映射表)
5) 将该 Actor 重新绑定到该 binding
6) 刷新 UI + 保存资产

6.3 “匹配规则”怎么设计才不脆?

推荐优先级(从稳到不稳):
1) Binding Tag / 自定义 Tag(最推荐)
2) Actor Tag(关卡里给 Actor 打 tag)
3) Actor Label(编辑器显示名)
4) Object Name(可读性差、容易变化)
5) “第几个 binding”(最不稳,尽量别用)

最稳的做法:
在制作 Sequence 时就规定:每个关键对象必须有固定的 Binding Tag/命名约定。
这样修复工具才能 100% 自动化。

7. 实战 2:批量添加 Track + Section(Transform / Property / Parameter)

你做“批量加轨”通常分三类:

7.1 给绑定对象加 Transform Track(最常见)

适用:相机、道具、角色根节点、任何 Actor 级动画。

步骤(概念):
1) 找到目标 binding
2) Add Track:3D Transform Track
3) Add Section:Transform Section
4) 设置 Section 范围(例如覆盖整个 Sequence)
5) 获取 channels(Location/Rotation/Scale)并打 key

7.2 给绑定对象加 Property Track(关键:PropertyPath)

适用:灯光强度、FOV、景深、蓝图变量等。

官方有专门的 Blueprint snippet 讲“如何拿 property name/path、track class,并把轨道加到 object binding 上并 keying”。
它基本就是“Property Track 批处理”的标准模板。

PropertyPath 怎么拿?

常见思路(不同版本 UI 名称可能略有差异):

  • 在 Sequencer 里手动加一次该属性轨,然后在轨道/属性上找 “Copy/Reference/Path” 类的菜单
  • 或者直接用“你知道的属性名 + 组件层级”拼接(不推荐,容易写错)
  • 或者把“可配置的 property path”做成 EUW 的可编辑字段(更像工具)

7.3 参数轨(Material/Component 参数)

适用:材质 Scalar/Vector 参数、组件材质索引等。

社区经验:

  • 一些参数轨需要 cast 到特定 section(例如 MovieSceneParameterSection)后调用 “Add Scalar Parameter Key”。
  • 某些细节在蓝图中可能不可调用(需要 C++ 暴露),因此你做工具时要准备“降级方案”(例如改用 Python、或改为在 Sequencer 中预设模板轨后复制)。

8. 实战 3:批量打 Key(写入曲线)与批量改 Key(偏移/缩放/删点)

8.1 批量打 Key:通用思路

1) 找到 Section
2) 拿到 Channel(Float/Bool/Enum/Vector 等)
3) 将时间(帧)转换到序列的 frame space
4) Add Key(Time, Value)

三种“打 key”的高频模式:

  • 初始化:在 0 帧写入初始值(例如相机初始 Transform)
  • 固定节奏:每 N 帧写一组 key(例如每 10 帧采样一次)
  • 二段式:start/end 两个 key,靠曲线自动插值(常见镜头推拉)

8.2 批量改 Key:偏移 / 缩放 / 改值

  • 时间偏移:所有 keys 的 time += Δ
  • 时间缩放:time = (time - pivot) * scale + pivot
  • 数值偏移:value += Δ(例如 FOV 全部 +5)
  • 数值缩放:value *= scale(例如强度统一乘 1.2)

8.3 删除/稀疏化 Key(进阶)

用途:

  • 降噪(比如动捕抖动)
  • 降低点数(性能/文件大小)
  • 清理误打 key(工具误操作)

实现思路:

  • Get Keys → 按规则筛选(例如每隔 N 个保留一个)→ 删除其余
  • 实战建议:给工具加 “Dry Run / 预览统计”,避免一键删爆。

9. 实战 4:自动 Camera Cut(创建 Cut 轨 + 绑定相机)

如果你做“模板镜头序列”或“自动生成预览 Sequence”,CameraCut 基本是必备。

社区给过一个很实用的蓝图链路(UE5.2 起非常常用):
1) Add Possessable(Object to = CameraActor)
2) Add Track(type = Camera Cut Track)
3) Add Section
4) Cast to MovieSceneCameraCutSection
5) Set Camera Binding ID(Camera Binding ID 来自 Add Possessable 返回的 Binding ID)

你可以把它封装成:
“把当前选中的 CameraActor 自动接到当前 Sequence 的 CameraCut”

“创建一个新 Sequence 并自动生成 CameraCut + 镜头片段”


10. 实战 5:Sequencer 驱动蓝图(Event Track / Director / Expose to Cinematics)

10.1 Event Track:在某一帧触发事件

最常见用途:

  • 镜头到某帧:开门/播音效/触发 VFX
  • 片段结束:切下一个 Sequence
  • 与 UI/剧情逻辑联动

官方提供了“从 Sequencer 的 Event Track 触发 Level Blueprint 事件”的流程。

10.2 Expose to Cinematics:让 Sequencer 直接关键帧控制蓝图变量

你想在 Sequencer 里对蓝图变量打 key(比如 float 强度、bool 开关),通常需要把变量设置为“可被 Cinematics 暴露”。
这样变量才会出现在 Sequencer 的可添加轨道列表里。

典型场景:

  • 控制材质参数(配合 MID)
  • 控制景深、后期参数(如果你把它们封装成蓝图变量)
  • 控制动画蓝图参数(例如表情强度、IK 权重)

11. 实战 6:Bake / 导出 AnimSequence(编辑器脚本)

如果你希望把 Sequencer 里的动画烘焙成 AnimSequence(类似 “Bake to Animation Sequence”),可以用 SequencerTools 的导出节点。

常见批处理需求:

  • 一个 Sequence 里多个角色绑定:一键全部导出为 AnimSequence
  • 自动化管线:修改 Sequence 后自动导出供后续流程使用

注意事项:

  • 这类节点多数是 Editor Scripting 范畴,不是运行时功能
  • 需要确保绑定对象上存在可导出的 SkeletalMeshComponent
  • 对 spawnables/动态生成对象的处理要特别小心(有些导出版本会“先 spawn 再导出”)

12. Spawnable vs Possessable:工具开发绕不开的概念

Possessable(占用型)

  • 绑定到关卡里已经存在的 Actor
  • 最常见:关卡相机、关卡灯光、场景道具

Spawnable(生成型)

  • Sequence 播放时由 Sequencer 负责 Spawn/Destroy
  • 常见:镜头用的临时道具、特效、一次性演员

为什么这对工具很重要?

  • 修引用:Possessable 断了需要你在关卡里重新找 Actor;Spawnable 则可能根本不需要“找关卡 Actor”
  • 导出动画:Spawnable 可能需要先保证它能被正确 spawn,导出才有效
  • 重用模板:模板序列更推荐用 Spawnable(可移植),但也更容易遇到“运行时对象生命周期”的坑

13. 时间系统:秒 / 帧 / DisplayRate / TickResolution(别把 Key 打偏了)

Sequencer 里至少有两套“时间尺度”:

  • Display Rate:你在 UI 里看到的帧率(例如 24/30/60)
  • Tick Resolution:内部更细的时间分辨率(用于精确采样)

工具开发时建议:
1) 统一使用 FrameNumber(不要混用秒和帧)
2) 所有“外部输入时间”(比如你 UI 输入的秒)都先转换到 Sequence 的 frame space
3) 写 key 之前确认:该 Section 的起止范围覆盖了你要写的时间

如果你做“按当前播放头帧打 key”的工具:

  • 需要从 Level Sequence Editor 获取当前时间/当前帧(不同版本的 API 名称略有差异,思路一致)。

14. “看起来没生效”的 90% 根因:刷新 UI + 保存资产

你在 EUW 里改完 Sequence 后,常见症状:

  • 你确定写了 key
  • 但 Sequencer 面板不显示变化
  • 或者重开编辑器后全没了

解决方案几乎永远是这两步:

1) 刷新 Sequencer UI

  • 有专门的蓝图 API:刷新在“下一 tick”生效

2) 保存资产

  • 你改的是资产,不保存就不会落盘
建议把这两步做成工具里的“统一收口”:
每次批处理结束都自动:Refresh + Save + 打日志

15. 常见坑与排错清单(节点找不到/轨道缺失/变量不可关键帧)

15.1 节点搜不到(最常见)

  • 先看插件:Sequencer Scripting 是否启用
  • 再看上下文:你是不是在 Runtime 蓝图里找 Editor-only 节点?

15.2 Property Tracks 缺失 / 某些属性找不到

原因通常是:

  • 属性不可被 Sequencer 动画化(或未暴露)
  • 你要控制的是组件/子对象属性,但轨道层级没选对
  • 蓝图变量没启用 “Expose to Cinematics”

解决策略:

  • 先手动在 Sequencer 里加一次轨道,看它真实生成了什么轨(Track 类型 + 目标对象层级)
  • 再回到工具里按同样结构生成

15.3 CameraCut 绑定不上

  • 最稳的方式:Set Camera Binding ID 的输入 Binding ID 直接来源于 “Add Possessable 返回的 Binding ID”

15.4 修改生效但 UI 不更新

  • 刷新 Sequencer UI(next tick)
  • 若你在批量循环里频繁刷新,建议“最后统一刷新一次”,避免卡顿

16. 工程化最佳实践:让你的批处理工具可维护、可升级

1) 定位规则与编辑动作分离

  • 定位:如何找到 binding/actor(Tag、Name、映射表)
  • 动作:如何加轨/打 key/导出
    分离后,你改定位规则不会牵动全部逻辑。

2) 用 Binding Tag / Actor Tag 做稳定锚点

  • 不要依赖数组下标
  • 不要依赖临时对象名
    否则序列一重排,你工具就炸。

3) 加日志与统计

  • 每个 Sequence:修了几个 binding、加了几条轨、写了多少 keys
  • 错误记录:找不到 actor、property path 无效、cast 失败
    批量跑全库没有日志 = 无法维护。

4) 做 Dry Run(预演模式)

  • 先扫描不写入,只输出“将要改哪些”
  • 确认无误再执行写入
    这能避免“一键毁库”。

5) 封装版本差异点

  • UE5.x 某些 API 会改名或迁移
  • 把“添加 spawnable/添加 subsequence/导出动画”等入口封装成单独函数
    未来升级 UE 时只改一处。

参考资料

下面是你写工具时最该收藏的一组入口(官方/社区),方便你对照节点名与行为。
返回文章列表 打赏
本页链接的二维码
打赏二维码