news 2026/8/13 17:39:10

【UE】【BP】在蓝图中Key关卡序列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【UE】【BP】在蓝图中Key关卡序列

以前都是处理资产标准化,遍历材质和相关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 → 保存资产

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

精髓就是这两张图。

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

如果是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 里。

最后实现是这样的。


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/导出
    分离后,你改定位规则不会牵动全部逻辑。
  1. 用 Binding Tag / Actor Tag 做稳定锚点
  • 不要依赖数组下标
  • 不要依赖临时对象名
    否则序列一重排,你工具就炸。
  1. 加日志与统计
  • 每个 Sequence:修了几个 binding、加了几条轨、写了多少 keys
  • 错误记录:找不到 actor、property path 无效、cast 失败
    批量跑全库没有日志 = 无法维护。
  1. 做 Dry Run(预演模式)
  • 先扫描不写入,只输出“将要改哪些”
  • 确认无误再执行写入
    这能避免“一键毁库”。
  1. 封装版本差异点
  • UE5.x 某些 API 会改名或迁移
  • 把“添加 spawnable/添加 subsequence/导出动画”等入口封装成单独函数
    未来升级 UE 时只改一处。

参考资料

下面是你写工具时最该收藏的一组入口(官方/社区),方便你对照节点名与行为。

  • Epic:Sequencer Scripting Foundations
    自动化编辑 Level Sequence 的基础心智模型。

  • Epic:Add Property Tracks and Keys to a Sequence in BPs
    Property Track + Key 的标准模板。

  • Epic:Actor Rebinding in Blueprints with Sequencer
    动态/修复绑定的官方说明。

  • Epic:Trigger Level Blueprint Events from Sequencer
    Event Track 触发蓝图。

  • Epic:Refresh Current Level Sequence
    刷新 Sequencer UI。

  • Epic:Export Anim Sequence
    编辑器脚本导出 / 烘焙。

  • Epic:Set Camera Binding ID
    CameraCut 绑定。

  • 论坛:CameraCut 绑定蓝图链路(UE5.2 经验贴)
    CameraCut 绑定蓝图链路参考。

  • 论坛:Component/Parameter 轨道加 Key(MovieSceneParameterSection 等)
    Component / Parameter 轨道加 Key 的讨论与实现经验。

  • Tech Blog:Performance at Scale: Sequencer in Unreal Engine 4.26
    Sequencer 性能与规模化,帮助理解大项目序列的性能特征。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:50:36

爱丁堡大学突破:AI实现无标注数据驱动的世界规律自我进化学习

这项由爱丁堡大学、Nvidia研究院、格罗宁根大学和剑桥大学联合开展的研究发表于2026年2月&#xff0c;论文编号为arXiv:2602.06130v1。该研究提出了一个名为SWIRL的框架&#xff0c;让AI模型能够像人类学习一样&#xff0c;通过观察世界的变化来理解事物的运行规律&#xff0c;…

作者头像 李华
网站建设 2026/7/14 15:50:50

YOLOv11涨点改进| CVPR 2026 | 全网独家首发、特征融合改进篇| 引入SRFusion 空间细化多级融合,含多种创新融合改进,涨点可直接发论文,适合裂缝图像检测,小目标检测任务高效涨点

一、本文介绍 🔥本文给大家介绍利用 SRFusion 空间细化多级融合改进YOLOv11网络模型,通过高分辨率特征引导低分辨率语义特征的融合,强化多尺度特征之间的空间细节信息交互,从而提升模型对目标区域的表达能力。该模块利用空间注意力对上采样后的特征进行加权细化,使网络…

作者头像 李华
网站建设 2026/7/14 15:50:50

前端性能优化面试题

文章目录一、CDN1. CDN 的系统架构2. CDN 的核心作用3. CDN 工作原理&#xff1a;从 DNS 开始传统访问 vs CDN 访问流程关键术语&#xff1a;CNAME4. 典型应用场景二、懒加载 (Lazy Load) 与 预加载 (Preload)1. 懒加载 (Lazy Load) —— 按需分配核心价值实现原理与公式代码实…

作者头像 李华
网站建设 2026/7/14 15:50:48

109. 天才ACM(二分、倍增

题源 倍增比二分快了一个logn #pragma GCC optimize(3) #include<bits/stdc.h> #include<iostream> using namespace std; #define int long long int K,M,N,T; const int MAX_LEN5e59; int arr[MAX_LEN]; int brr[MAX_LEN]{}; template<typename T> inline…

作者头像 李华
网站建设 2026/7/14 15:50:48

代码筑梦者:数字世界的隐秘建筑师

代码筑梦者&#xff1a;程序员的隐秘世界在数字时代的星河里&#xff0c;有这样一群人——他们的指尖在键盘上飞舞&#xff0c;用0和1编织着世界的另一重维度。程序员&#xff0c;这群现代社会的代码筑梦者&#xff0c;他们的工作早已超越了简单的“写代码”&#xff0c;而是成…

作者头像 李华
网站建设 2026/7/14 15:50:49

库存管理,把这4件事做好就够了

目录 第一件事&#xff1a;搞清楚你到底有什么 第二件事&#xff1a;想清楚什么时候买&#xff0c;买多少 第三件事&#xff1a;把东西放在该放的地方 第四件事&#xff1a;定期清理不动销的货 写在最后 之前和一些做企业的朋友聊天&#xff0c;很多人提到库存管理&#x…

作者头像 李华