首页 / 大项目模块 / 传送 / V2 表现 / Seq2 → Seq3 衔接问题

Seq2 → Seq3 衔接问题

2026-09-29 增补:请先区分当前实现与历史计划

原文全部保留、不删不改。下方 2026-09-28 的“三 Shot”“Transition 未实现”及 ExitArmed / EffectFired 门禁等叙述是当时快照或设计计划,不是本轮实现结论。当前 All 已按四段 Entry → Loop → Transition → Landing 执行;Loop 就绪后自然收圈,第 3 段正式播放美术事件时间轴,第 4 段在独立 Seq3 容器落地。本轮并未实现独立的 ExitArmed / EffectFired 门禁。

入口 FullScreenEffect 后处理与 All 第 3 段的事件特效是两套独立机制。新测试材质和实例已保存,但当前 DT_Teleport 的 FullScreenEffect 全为 None,本轮没有改表;保存资源不代表已接入传送,更不代表 Shader 或 PIE 画面验收通过。

以页末 本轮详细变更与配置说明 为当前补充依据;Shader / PIE 验证记录由主 Agent 实测后补充。旧章节的工具结果、P4 状态和行号均保留其历史时间边界。本轮文档任务只追加此页,不改业务代码、不改资产、不提交 P4。

2026-09-28 更新:当前代码事实、独立 Transition 方案、黑屏与 All 静态评审、验收矩阵和 P4 交付边界。本次只更新文档;不实现业务代码,不创建或提交 CL。历史试验记录保留在文末,不作为当前实现依据。

1. 当前事实:首次完整循环不等于最后一圈结束

检查基线为 D:\zhaozibo_071 工作区当前本地内容与对应 #have 的差异,不将整个文件或历史提交都归因于今日新增。主要涉及 TeleportV2Flow、TeleportController、TeleportPresentation、SceneWaitWpStreamingCmd;同时核查原生配置头、生成类型与 UE 5.5.4 本分支源码。

已确认 Teleport01_All.uasset 存在,位于角色 R1012 的 Teleport/01 目录,今日 CL 842533 新增、have/head 均为 #1。尚未在编辑器读取其实际 Shot 边界、事件、绑定 locator 或软引用,也未运行 UE 验收。

2. 已选方案:循环自然收尾 → 独立 Transition → Seq3

语义约定:特效不得在普通循环触发;最后一次 Seq2 正常完成后,进入非循环 Transition,在其中触发并完成约定的特效表现,Transition 结束后才正式开始 Seq3。完成以演出时间轴契约为准,不能默认 Niagara 自动销毁就代表表现结束。

flowchart TD
    A[Seq2 循环等待] --> B{退出条件全部满足?}
    B -- 否 --> A
    B -- 是 --> C[关闭无限循环,继续当前圈]
    C --> D[自然结束通知,一次性消费]
    D --> E[非循环 Transition:轨道触发一次特效]
    E --> F[Transition 完成且特效已触发]
    F --> G[正式交接并启动 Seq3]
    C -. 取消或异常 .-> X[统一恢复和清理,不触发退出特效]
    E -. 取消或异常 .-> X

2.1 资源组织与协议

  1. 拟采用四个有序 Shot:Seq1 / Seq2Loop / Transition / Seq3。Transition 是独立非循环子序列,在旧过场容器中沿用 Seq2 假人、场景与相机;结束后才执行原来的真假人切换。不要在其开始时提前移动旧容器或隐藏假人。
  2. 将三段范围返回值改为具名四段范围,校验恰好四个有效、不重叠、顺序正确的 Shot;Seq1/Seq2 索引不变,Seq3 从第三段改为第四段,新 Transition 使用第三段。调用方全部一起修改,不能只把 ranges.length===3 改成 4。
  3. 所有配置使用 All 的资产必须与代码协议同步迁移。未配置 All 的独立 Seq1/2/3 路径保持原行为,不宣称自动具备 Transition 功能。若该需求也覆盖独立资源路径,需另行补明确的 Transition 配置,不猜路径、不按名字自动兜底。
  4. Transition 的开头姿态和相机接 Seq2 尾部,结尾接 Seq3 起点。核查子序列时间偏移、播放速率、相机 Cut、主组件及每个武器槽的绑定;扩展后仍须补齐全部 Shot 的 Player 子轨。
  5. 特效事件放在 Transition 内明确的正向播放时刻,建议避开 Scrub 起点及 exclusive End 边界;不得继续放在循环 Seq2 内。Transition 总长度须覆盖特效可见生命周期,结束前显式收束或停止持续特效。

2.2 退出就绪与自然圈尾

就绪条件由流程决定:流送已完成、Seq3 资产/目标角色/换装/绑定已准备、Transition 资源及特效可用、当前 generation/epoch/world/目标角色仍匹配。条件满足只设置一次 ExitArmed,不 Stop、不跳尾、不生成特效。

本分支引擎依据:MovieSceneSequencePlayer.cpp:1282–1384 仅在到达结束边界时判断是否循环,条件为 LoopCount<0 || CurrentNumLoops+NumTimesLooped<=LoopCount。正向播放中,将无限循环设置为 new UE.MovieSceneSequenceLoopCount(0) 后,不会主动改变当前位置;下一次到边界时进入自然结束路径。无需把已累计循环数清零,也不要用 Stop/重新 Play 来清数。

实施时先注册本阶段专属结束回调、更新状态,再通过项目已有的 struct 赋值方式修改 LoopCount。保留 bPauseAtEnd=true 与姿态保持,等待自然结束;puerts 写入是否即时生效必须在编辑器验证。若准备在当前帧回绕之后才就绪,则下一整圈成为最后一圈,这是明确允许的边界语义。

新流程不再使用“帧号回绕”作为最终交接依据。Seq1 正常结束、Seq2 正向从起点播放后,即使第一圈内准备就绪,也可关闭循环,让该圈自然结束,已经满足至少完整播放一圈;不要再强制等待 HasSeq2PlayedOnce 才允许 arm,造成额外一圈。旧标志若用于其他逻辑应分别核查,不在本次方案中盲删。

结束回调必须幂等:MovieSceneSequencePlayer.cpp:575–593 的 FinishPlaybackInternal 会广播 OnFinished;同文件 1407–1432 还会排队结束广播。不得把一次回调等同于一次独立流程。回调入口同步消费状态,再解除自己的委托,不对共享播放器粗暴 Clear 所有监听。切范围/启播应排到当前求值及结束回调派发之后的安全 Tick,使用 TimerSystem 与代次校验,避免旧结束通知误消费新阶段。安全 Tick 的先后顺序须用引擎运行日志验证。

2.3 轨道事件与一次性特效

2.4 实施次序与日志

  1. 先在最小编辑器用例验证“播放中 -1 改 0 的圈尾结束”、重复 OnFinished 防护、求值结束后安全切段、V2 轨道事件及 puerts 上下文;该步骤未完成前不批量迁移 All 资产。
  2. 调整四段解析/所有调用点、预载及校验;同步制作 Transition 子序列和第四 Shot。Seq3 可后台准备,但不得提前提交可见交接。
  3. 在 OnStartDownInternal/ExitLoadLevelAsync 链中插入 arm 与 Transition 等待,将原先 Stop 旧播放器的提交路径移到 Transition 完成之后。
  4. 实现阶段令牌与特效一次性入口,把新增等待/资源纳入 ClearSeq3Preparation 和统一失败恢复;不新增全局事件开关。
  5. 日志沿用“传送-V2”前缀,记录 generation、阶段、播放器ID、world、角色ID、范围/当前帧、ExitArmed、Seq2Finished、EffectTriggered、TransitionFinished、Seq3Committed、Abort。记录引擎帧号与帧内序号;不能只靠毫秒时间戳区分同帧顺序。

3. 今日相关改动的静态评审

结论:确认 1 项格式规范问题;未确认黑屏或 All 的新增运行时逻辑缺陷。静态审查不能替代资源和画面验收。

项证据与评估后续
P3:格式错误导致 lint 不通过SceneWaitWpStreamingCmd.ts:17 新增联合类型声明未换行;77 行赋值结构修改后,78–83 行保留多余缩进。共 7 条 prettier/prettier error,双独立复核确认由本地修改引入。后六行本身是 diff 上下文,不称其全部为新增行。后续获准修改时只格式化相关代码;本次不自动修复,也不将格式问题升级为运行时故障。
黑屏触发与持续入口遮挡 ready 后再发传送请求;Seq1 首帧 Scrub 后淡出遮挡,并等待公共黑屏视觉关闭后 Play。进退各固定 200ms;关键遮挡等待 5000ms、公共黑屏关闭等待 3000ms。存在 generation/epoch 隔离及公共黑屏恢复。代码 ready 仅表示参数/跨 Tick 条件满足,不等于 GPU 已完全遮住。需验证 CoverProgress=1 的实际全屏遮挡、曝光和相机后处理叠加。
黑屏过渡兼容材质要求 MD_PostProcess、CoverProgress 0→露出/1→覆盖;独立 Volume/MID。静态未确认代次变化造成新增残黑路径。同图/跨图、UI 黑屏、无缝遮罩、高优先级 Volume、材质无效、世界切换均需逐帧查看;200ms 只是实现值,不等于自然度已通过。
All 分段正确性GetStartFrame/GetEndFrame 已由引擎转换为 DisplayRate;SetFrameRange 越界时 Reset 求值位置,首次 Play 不扫过旧段事件。排除帧单位与不重置位置两项疑点。实际资产需确认三 Shot 范围、帧率、时间偏移及 exclusive End;亚显示帧边界取整尚未证明在该资产构成问题。
All 角色与武器原生绑定全部 Player 父轨,但每种子组件只查首个;TS 补全部 Shot 子轨。武器数组保留空槽。ResetBinding 撤销覆盖,不等于强制空绑定。缺武器槽、不同角色、子序列 locator、CustomBinding 必须资产验收;不能声称 Reset 必然绑定模板武器。
性能与可维护性All 省去 Seq1→Seq2 单独资源切换,Seq3 仍有独立播放器及准备成本;遍历绑定发生在准备阶段。未做性能采样,不承诺性能提升比例。固定三 Shot 协议、状态字段及异步路径是维护重点。对比独立资源/All 的加载峰值、准备耗时、帧耗、GC 与后处理 GPU 成本;新增方案使用具名段范围和单一阶段所有权,不顺手重构整个大文件。
异常处理现有有界等待、代次校验、准备取消和失败恢复形成基础;SceneWaitWpStreamingCmd 的 timer/promise 身份清理未确认新增缺陷。Transition 必须进入同一清理链,不能留下额外定时器、结束监听或持续特效。

静态工具记录:四个业务文件定向 ESLint 返回 7 errors / 154 warnings,退出 1。警告包含拼写、TeleportV2Flow.ts:3808 的 setTimeout 限制;未逐条证明警告由本次差异引入,故不计作新增缺陷。直接执行 tsc -p tsconfig.json --noEmit 退出 0。此前 npm 包装命令也退出 0,但输出未展示传入的 noEmit 参数,不能保证该次没有编译产物;因此补跑了显式 noEmit 命令。未对潜在生成产物做删除或回滚。

4. 测试与验收方法(待执行,不是通过记录)

成功流程应满足事件偏序:Seq2Finished < EffectTriggered < TransitionFinished < Seq3Committed。比较帧号和帧内序号;允许相邻事件在同一引擎帧,但不允许逆序。普通循环与所有预热期间触发数为 0;正常完成的一次流程触发数恰为 1。发生取消的流程不能要求必有特效,但取消后不得再新增触发。

用例操作断言
第一圈提前就绪Seq2 起播前或第一圈中途完成准备第一圈正常播完才进入 Transition,不中途 Stop,不强制多等一圈。
多圈慢加载分别在第 2、5 圈中间完成准备之前每圈特效均为 0;就绪所在圈正常完成后恰好触发 1 次。
边界竞争结束边界前后各一帧完成准备是否多一圈由 arm 与循环求值先后决定;不截断、不漏特效、不重复进入 Transition。
帧率和卡顿不同帧率,注入超过一圈时长的卡顿退出不依赖 Tick 看见回绕;自然结束和事件幂等仍成立,画面跳帧单独记录。
事件边界Scrub、Play/Pause 预热、反向、编辑器拖动、重复同名事件非当前 Transition 正向正式播放不触发;重复回调只消费一次。
重复结束通知记录本分支 OnFinished 同步与排队广播旧阶段广播不能结束新阶段;求值完成前不切范围/提交可见交接。
漏事件或资源无效删除事件、无效材质/Niagara、缺 Transition Shot明确失败和恢复,不静默跳过后声称成功;不残黑、不留相机或输入锁。
中断与重入循环/收尾/特效期间取消,销毁角色或换世界,再次传送旧代次事件被拒绝,监听/计时器/特效释放,不污染新流程。
角色与武器不同角色、武器空槽、多武器、不同子序列绑定所有 Shot 绑定当前演员;特效在可见假人上,Transition 结束后无悬空残留。
黑屏组合同图/跨图、未配置/正常/加载失败材质、叠加 UI 和相机后处理遮盖后传送,首帧就位才露出,无提前裸屏、残黑、重复盖屏或遮挡 UI 的错误层级。
演出自然度逐帧录制两个边界及落地Seq2尾→Transition头→Seq3头姿态、位置、镜头连续,特效完整,不以200ms固定值代替视觉验收。
资源和性能编辑器 Reference Viewer/资产校验、Cook、性能捕获All及子序列、特效、材质引用可打包;无仅开发目录依赖泄漏;比较 CPU/GPU/内存峰值,不仅查看加载成功。

5. P4 状态与评审材料

遵照最新选择:不 sync、不 resolve、不实际 reconcile、不创建 CL、不 submit。所有读取命令显式使用 p4 -c zhaozibo_071。本轮人工编辑仅此站点页面,位于 P4 workspace 外;未归入任何 P4 changelist。

范围状态后续获准提交前
四个业务 TS本地差异未 checkout。TeleportV2Flow +617/-18;TeleportController +20/-5;TeleportPresentation +39/-6;SceneWaitWpStreamingCmd +52/-5,按本次检查快照记录。重新确认差异归属、修复格式,再定向 reconcile;不要从 default 列表反推没有改动。
STeleportDef.hhave #2 / head #3,default edit;本地文本与 head 一致。处理 have 落后及已有 open 状态,不重复提交 head 已有内容。
ISt_STeleportDef.ts / St_STeleportDef.tshave #1 / head #3,未 open;本地文本与 head 一致。使用保留本地工作的同步流程对齐基线,避免把已提交内容重复纳入。
STeleportDef.d.tshave #1 / head #3;类型一致,但本地缺 head 中 FullScreenEffect 前的三行 Tooltip 注释。对齐注释及版本,必要时从正确配置头再生成;不能称全文一致。
今日已有提交842533:Teleport01_All #1;842634、843363:配置头 #2/#3。历史标题为【s1181169】【关卡动效】传送loading接回完整版表现。作为资源/配置依赖核对,不冒称本轮新提交,也不自动复用为用户指定标题。
编译输出npm 包装检查未确认 noEmit 传参;对核心 JS/JS.map 的 reconcile -n 显示相对 depot 存在差异,不足以判断哪些由此前或本轮编译产生。未 checkout、未删除、未纳入;后续按项目构建产物策略核对,不能无依据回滚用户产物。

resolve -n 未列出待处理项,只说明当前没有已排队的 resolve,不表示版本已对齐或冲突流程已完成。本轮没有声称已解决所有合并冲突。

default 原有五项保持不动、不纳入:DefaultKuroPuerts.ini、P_SE_Flash.uasset、M_PP_TeleportSolidCover.uasset、STeleportDef.h、FightCameraLogicComponent.ts.orig。后两种特效资源可能与演出有关,但未验证引用及打包依赖,不自动纳入,也不将 .orig 当业务交付。

后续 CL 说明草案(未创建):【传送】完善 V2 遮挡与 All 序列衔接。说明应列黑屏时序、All 分段及多 Shot 绑定、流送等待清理、对应资产/配置依赖、lint与类型检查结果、UE用例证据和残余限制;Transition 目前只有方案,未实现前不得写进“已完成”列表。本页即方案与评审材料,不额外创建文档副本。

历史试验:现象定位(非当前实现)

以下为旧版切场试验的压缩留档,临时埋点代码当时已还原,原始会话时间为 19:09 与对照组 10:47,未记录完整日期和对应 revision。不得据此断言当前必须固定等待 200/300ms、没有相机保持或落地收尾固定约10ms。当前已有独立准备与相机保持相关实现,应以源码与新的运行证据为准。

历史现象当时定位当时结论的适用边界
切场瞬间穿帮退出 loading、资产就绪、演员接管当时怀疑 Seq2 暂停姿态与 Seq3 首帧不一致,不能直接推广到当前所有穿帮。
Seq3 无角色或动作换装 / binding 跨帧旧试验中压成同帧会失败;并非证明固定毫秒等待是唯一正确方案。
看不到落地OnFinished 后还原链、相机提前交回只描述旧试验,当前要重新验证镜头保持及落地时序。

历史阶段顺序

Seq2 循环 → 退出 loading/暂停 Seq2 → Seq3 资产就绪 → 演员接管 → 换装等待 → binding 等待 → Seq3 播放/OnFinished → 落地还原。

历史实测耗时

历史阶段19:09 会话10:47 对照
退出 loading → Seq2 暂停1ms未记录
Seq2 暂停 → Seq3 资产就绪 → 演员接管各0ms未记录
换装等待203ms未记录
binding 等待312ms未记录
binding 结束 → Seq3 OnFinished约5.4s未记录
OnFinished → LightDown3ms3ms
LightDown → OnEnd8ms7ms
收尾总窗口约11ms约10ms

历史落地采样

19:09:04.998 设置 CameraActor_20;05.001 相机压栈释放;08.129 Seq3 OnFinished;08.132 LightDown;08.140 OnEnd;08.637 还原后陷入量采样 −2.15。当时记录显示相机在 Seq3 结束前约3.1s交回。此结论不得替代当前验收。

来源与限制

历史数据来自旧 Client.log 摘要,原页面中的导航锚点保留。本次结论来自当前工作区差异、原生 UE 源码、两项独立审查及工具运行结果;未新增运行时测量。工具证据日期:2026-09-28。

2026-09-29 本轮详细变更与配置说明

本节为独立追加,不覆盖旧文。以下区分本轮实现/资源事实、配置操作说明、待实测项目;代码事实已定点对照当前 D:\zhaozibo_071\Source\Client\TypeScript\Src\Game\Module\Teleport\TeleportV2Flow.ts,资产保存、DT 当前值和既有工具检查结果按本轮交接事实记录。本次文档编辑没有再次修改业务、配置或资源,也没有创建/提交 P4 changelist。

6.1 本轮修改清单与职责边界

范围本轮记录不能据此推导的结论
All 四段解析具名范围为 Entry、Loop、Transition、Landing;取根首个非空 CinematicShotTrack 的 Section,按起始帧排序后分配职责;旧 Seq1/2/3 配置仍保留。不是按 Shot/子资产名字识别;不是任意轨道混合收集四段。
Loop → Transition → Landing准备好后进入 FinishingLoop,将 LoopCount 从 -1 改为 0,等当前圈自然结束;第 3 段正式 Play;TransitionFinished 后才执行原有球体移动与独立 Seq3 交接,第 4 段负责落地。不代表已增加 ExitArmed 或 EffectFired 一次性特效门禁;也不代表事件、镜头、姿态已实测通过。
All 多 Shot 绑定与重影定位逐 Player 根绑定补对应的主组件和武器子绑定;历史重影定位为第 3 段漏 Player,默认角色未被当前角色替换。新增 PIE 标签覆盖提示,提醒逐实例检查。不能把一次缺 tag 的原因推广为所有重影原因;通知不自动修资产。
入口 FullScreenEffect通过 MaterialInterface 软引用加载后处理材质,创建本轮独立 MID / Unbound PostProcessVolume,用 CoverProgress 做入口盖住与首帧露出,保留黑屏兜底、身份隔离和清理边界。不是 Niagara 播放器;与第 3 段事件特效没有自动互相驱动关系。
新测试资源M_PP_Teleport_FullScreenTest 与 MI_PP_Teleport_FullScreenTest 已成功保存,设计为蓝青色光环与材质程序化屏幕粒子;完整路径及参数见后文。当前 DT 的 FullScreenEffect 仍全为 None;保存成功不等于 Shader 编译、PIE 或打包验收成功。
临时诊断清理已清理 8 处 Seq1 HTTP 诊断,以及 1 处重影采样 timer / 枚举;保留正式传送日志和 PIE 标签校验。不是删除所有日志,也不是用清理诊断替代功能验收。
代码工具检查本轮业务变更的定向 ESLint 和 npm run tsc-native 已通过(交接记录)。本次仅编辑文档,另跑站点校验。静态工具通过不证明材质像素遮挡、事件触发次数或传送画面已通过;旧文 9 月 28 日失败记录仍是历史快照。

6.2 DT_Teleport 两项字段:按 RoleId 选择,不是全角色共用一行

数据表:/Game/Aki/Data/Teleport/DT_Teleport。按当前角色 RoleId 选择配置,所以核对时必须同时记录角色、行和软引用,不能只看某个 All 资产存在。

字段类型与用途当前状态 / 配置注意
FullScreenEffectTSoftObjectPtr<UMaterialInterface>,可引用后处理母材质或材质实例;负责入口盖住场景并在 Seq1 首帧就位后露出。当前所有行均为 None,本次不改 DT。通常未配/不可用走原黑屏;不是 Niagara 软引用,也不是 All 第 3 段的事件资源字段。
SeqAllLevelSequence 软引用,负责四段演出来源。按当前 RoleId 的行读取,解析四段成功时按 All 路径播放。R1012 罔理的默认引用为 /Game/Aki/Character/Role/R1012/Sequence/Level/Teleport/01/Teleport01_All.Teleport01_All。旧 Seq1 / Seq2 / Seq3 字段保留用于独立资源路径。

不要在表中找 200ms、5000ms 或材质粒子参数字段:进退时间与关键等待是代码常量,颜色和粒子表现属于材质/实例参数;DT 这两项负责资源引用。

此处需配图:DT_Teleport 的 RoleId、FullScreenEffect、SeqAll 与旧 Seq1/2/3 列;标出 R1012 行及当前 FullScreenEffect=None,不展示成已接入新材质。

6.3 All 四段职责、自然收圈与球体交接

排序后的位置阶段 / 播放职责配置与衔接要求
第 1 段Entry:进入演出,只播放一次。角色进入、起始姿态和镜头。入口遮挡退出要等本段首帧 Scrub 就位,不把它当循环段。
第 2 段Loop:LoopCount=-1,循环等待关卡与落地准备;就绪后转 FinishingLoop,LoopCount 改为 0,让当前圈自然播完。不要通过 Stop 或跳尾截断当前圈;不要把只希望在退出时出现的衔接特效放在每圈都会播放的事件轨上。
第 3 段Transition:非循环正式 Play,给美术事件时间轴触发衔接效果;完成后进入 TransitionFinished。沿用旧侧演出上下文;切本段范围后不以 Scrub / 预热代替正式播放。事件时间、效果时长与首尾姿态由资产时间轴配置和实测确认。
第 4 段Landing:在独立 Seq3 容器 / 播放器中播放 All 第 4 段,落地收尾。“Seq3 容器”是运行时落地侧的旧命名,不是 All 第 3 个 Shot。只有 TransitionFinished 后才允许正式可见交接。

当前顺序为 Entry → Loop → FinishingLoop → Transition → TransitionFinished → Landing。TransitionFinished 后沿用现有球体迁移:取绑定 TeleportLoadSphere1,将其移到玩家根坐标的 Z + 10000,随后独立 Seq3 容器播放 Landing。不是在第 3 段开始时就搬球体,不是将玩家直接上移 10000。All 路径球体失效或移动失败保留报错/恢复边界,不能忽略错误后当作成功。

事件契约的实现边界:第 3 段已正式播放,给事件轨自然求值;但当前没有已实现的 EffectFired / ExitArmed 门禁,也没有“特效已触发才允许落地”的该项证明。旧文第 2 节的一次性入口、漏事件门禁等仍是历史设计,不能据此宣称已拦截所有重复事件、漏事件、预览或反向触发。美术应将衔接事件放在第 3 段的有效播放范围内,检查事件目标、生命周期和清理,并以本轮实际触发记录验收。

此处需配图:All 根 CinematicShotTrack 四个 Section 总览,标注第 1 Entry、第 2 Loop、第 3 Transition、第 4 Landing;展开 Transition 的事件轨并标记触发时刻、范围边界及球体迁移在段结束之后。

6.4 帧区间与真实回退规则

解析根序列中首个非空 CinematicShotTrack的 Section,并按起始帧升序排序;必须有四段。职责按排序位置赋予,不按 Shot 名、子序列文件名或“Seq02/Seq03”字符串识别;重复引用同一子序列不会合并为一个段。

范围为显示帧的左闭右开 [start,end)。相邻段如 [0,222) 与 [222,300) 不重叠:222 属于后一段,不属于前一段。FrameLocked 的尾帧按 end-1 理解;不要把排他 end 当作必须实际播放的一帧。

四段范围示意(仅示例,非资产实测值)区间FrameLocked 尾帧
Entry[0,222)221
Loop[222,300)299
Transition[300,360)359
Landing[360,480)479
情况当前处理
无可用的根 CinematicShot 分段、数量不是 4、边界非有限数、长度非正报错,放弃本次 All 分段结果,退到独立 Seq1/2/3;独立资源本身仍需有效。
相邻范围重叠仅报错提示,继续按配置播放;不能写成“严格拒绝重叠”。配置侧仍应消除重叠并复测。
相邻范围有间隙当前不校验间隙;没有报错不代表范围连续或镜头/姿态连续。
All 资源加载失败走失败恢复,不等同于自动退独立 Seq1/2/3。必须与“已加载 All 但分段校验失败”区分。
未使用 All / 保留旧资源配置沿用独立 Seq1/2/3 路径;不能宣称它自动获得四段 Transition 的资产协议。

6.5 All tags:Player 必须逐 Shot 实例配置

Player 必须保持这个准确大小写。它是 Sequencer Binding Tag(序列绑定标签),不是 Actor 的 Tags,不是轨道显示名,也不是只把角色资产重命名为 Player。标签要指向每个 Shot 实例中的角色根绑定。

  1. 从 All 根时间轴逐个进入第 1~4 个 Shot,找到该段角色 Actor 根绑定,检查/设置 Binding Tag 为 Player。在授权的资产编辑流程中保存 All,并核对实际涉及的子资产;本次文档编辑不操作保存。
  2. 即使第 2 段和第 3 段重复引用同一个 Seq02,也必须逐实例检查。完整 BindingID 含 SequenceID;同一子资产、同一个 Guid 不等于同一个 Shot 实例的完整绑定。
  3. MainComponent、WeaponComponent_0 等是 Player 根下直接 Possessable 子绑定名称,不是额外 tags。主组件和各武器槽按名称与父 Guid 匹配;保留武器槽索引,检查不同武器/空槽,不要用扁平标签代替父子层级。
  4. 逐段预览并在 PIE 检查被替换的是当前角色,尤其第 3 段。历史重影的已知原因是第 3 段漏 Player,默认角色没有被替换;不能只检查第 1 段正常就认为全 All 正常。

PIE 校验提示的能力:在 PIE 中检查,发现缺口时给出 20 秒非模态通知并写日志;不阻断传送、不自动补 tag、不自动保存资产,且不在正式包运行。按子资产分组,以不同 SequenceID 统计有效角色根绑定覆盖;同一实例多标签不重复计数。重复使用同一子资产时,提示只能列出候选段,不能精确断言哪一个实例缺 tag。覆盖数量相等也不是所有绑定对象、角色、组件和轨道都正确的充分证明,仍需人工逐实例检查。

此处需配图:All 内四个 Shot 实例各自角色根的 Binding Tag=Player,突出重复 Seq02 的不同 SequenceID;另展示 MainComponent / WeaponComponent_0 作为根下直接子绑定名称,而非 tags。
此处需配图:PIE 20 秒非模态 Player 标签缺口通知及对应日志,标注重复资产的候选段提示限制;不要把通知截图标成“自动修复成功”。

6.6 已保存的全屏测试材质:不是 Niagara

  • 母材质:/Game/Aki/Effects/Niagaras/Common/Teleport/Temp/M_PP_Teleport_FullScreenTest。
  • 材质实例:/Game/Aki/Effects/Niagaras/Common/Teleport/Temp/MI_PP_Teleport_FullScreenTest。
  • 两项资源已成功保存。虽然目录含 Niagaras,它们仍是后处理材质与材质实例,不是 Niagara System;屏幕粒子由材质程序化生成,不是世界粒子发射器。
  • 表现设计:深蓝遮盖底色、蓝青色光环与程序化屏幕粒子。材质域为 MD_POST_PROCESS(运行时枚举 MD_PostProcess);UE 5.7.4 Blendable Location 为 BL_SCENE_COLOR_AFTER_TONEMAPPING,材质 Blendable Priority 为 100。
  • 以上是资源与参数事实,不是 Shader / PIE 通过结论。当前 DT 未引用它们;Temp 目录资源是否纳入正式引用及打包需另行确认。

6.7 材质参数表与美术调整口径

参数默认值建议/约定范围含义与误区
CoverProgress00..10 完全露出;1 完全遮盖场景;中间值为过渡。运行时驱动该参数。契约针对场景,不保证覆盖 UI;是否真的遮住场景像素仍需实测。
ParticleDensity186..32程序化网格密度,不是粒子总数量;变大意味着格子分布更密,不能解释为精确生成 18 个粒子。
ParticleSpeed0.120..0.5控制漂移 / 光环速度;闪烁独立使用 Clock * 1.8,因此设为 0 不代表所有动画和闪烁都停止。
ParticleBrightness0.650..2屏幕粒子亮度;调高后要检查曝光、相机后处理与视觉舒适度,不以数值代替画面验收。
RingIntensity0.220..1蓝青色光环强度,不是 CoverProgress,也不控制整个后处理 Volume 的权重。
CoverColorLinearRGB (0.008, 0.018, 0.045)颜色向量遮盖底色;按线性 RGB 输入,不把这些小数直接当作 sRGB / 十六进制色值。
AccentColorLinearRGB (0.03, 0.55, 0.8)颜色向量光环/粒子的蓝青强调色;与 CoverColor 一样,alpha 当前未使用,不通过 alpha 调透明度。

推荐在实例中调整表现参数而不是直接改母材质图;范围是本轮调参口径,不应未经检查就宣称运行时对每个参数都有强制 clamp。先单独看 CoverProgress=0、中间值(例如 0.5)、1,再在真实 200ms 进退中检查连续性。

此处需配图:母材质 MD_POST_PROCESS、BL_SCENE_COLOR_AFTER_TONEMAPPING、Priority=100 设置,以及实例全部参数默认值;颜色编辑器需标清 LinearRGB,alpha 未参与。
此处需配图:CoverProgress=0 的同机位场景画面,确认完全露出并检查无粒子/光环残留遮挡;仅待实测截图,不是当前通过证据。
此处需配图:CoverProgress 中间值(建议 0.5)的同机位画面,展示深蓝过渡、蓝青光环和程序化屏幕粒子,并记录实际取值。
此处需配图:CoverProgress=1 的同机位画面,核对场景是否完全遮盖;将仍可见的 UI 单独标注,不能将“不遮 UI”误判为场景遮盖失败或宣称遮住所有 UI。

6.8 入口运行时逻辑、ready 与错误边界

入口材质不是直接改场景常驻 Volume:运行时以配置材质创建独立 MID,生成本轮 PostProcessVolume,设置 Enabled、Unbound,Volume.Priority=100000、BlendWeight=1、该 MID 的 Blendable.Weight=1。这里的 Volume 优先级 100000 与母材质 Priority 100 是不同层级,不能相互替代。

  1. 入口读取当前角色的 FullScreenEffect。未配置通常用原黑屏;已配置时加载 MaterialInterface 并检查母材质为后处理域,创建 MID / Volume。
  2. 先设 CoverProgress=0,再用固定 200ms 推进到 1。检查材质、Volume、World 身份、启用/无界状态、两个混合权重和优先级,读回 CoverProgress=1;到端点后至少跨一 Tick / 引擎帧才报告逻辑完成。
  3. 入口遮挡 ready 后再发真实传送请求。ready 仅说明参数、对象、身份及跨帧条件满足,不是 GPU 完成渲染或像素已完全遮挡的证明;也不能证明该材质图正确消费了 CoverProgress。
  4. Seq1 首帧 Scrub 就位后,将 CoverProgress 从 1 用固定 200ms 退到 0 并释放本轮后处理。公共黑屏关闭及首段播放沿用其独立时序,不把后处理 ready 等同于公共 UI 黑屏已关闭。
  5. 关键入口等待为 5000ms,进退 200ms 和等待值都是代码常量,不是 DT 字段,也不是 ParticleSpeed。超时、取消、代次变化和 World 变化必须遵循各自恢复/清理路径。
情况当前边界
未配置、加载/类型/材质域不合适、进场不可用通常尝试原黑屏兜底;不是任意失败都能无条件成功。保留错误日志和有界等待。
持有遮挡期间材质或 World / Volume 状态失效尝试转一次黑屏;黑屏兜底也失败且流程仍有效时,进入失败恢复与结束。不得持续重开黑屏造成递归。
发包前遮挡仍未 ready中止发包路径并结束上升,不应裸露场景后仍把请求当成正常成功。
代次 / epoch / World 变化旧任务不得继续驱动新流程;按当前流程身份取消、清理或恢复,不能把过期异步结果当作成功。
首帧交接后的退场异常记录错误并释放本轮后处理、继续 Seq1;不能将这一分支笼统写成“所有异常都会重新盖黑屏”。
All 加载或落地交接真实失败走相应失败恢复;不是 FullScreenEffect 原黑屏兼容路径,也不能用独立资源自动回退掩盖错误。

两套特效再次区分:入口 FullScreenEffect 由代码驱动 CoverProgress,作用于全屏场景后处理;第 3 段 Transition 特效由美术事件时间轴配置和触发。给 DT 配 MI 不会自动在 Transition 里放事件,给 Transition 放事件也不会自动开启入口 MI。

6.9 配置与联调步骤(操作指引,本次未执行改表)

  1. 先记录测试角色 RoleId、DT 行、目标传送点及当前引用。当前所有 FullScreenEffect=None 是基线,不先改表就不能声称新材质已用于真实传送。
  2. 打开该角色的 SeqAll,确认首个非空 CinematicShotTrack 恰好四个有效范围,按时间顺序核对职责、子序列偏移/速率、镜头 Cut 和帧率。不要靠名字推断第 3 段一定是落地。
  3. 按第 6.5 节逐 Shot 实例检查 Player 和其直接组件子绑定,特别是重复 Seq02 和第 3 段。修正资产需走独立授权范围,本次文档操作不补 tag、不保存资产。
  4. 在 Transition 中配置衔接事件的目标、时刻和持续时长,检查最后一圈尾→Transition 头→Landing 头的角色与镜头连续性。入口材质不要混填成该事件资源。
  5. 打开已保存 MI,核对母材质域、Blendable Location 与参数,先做 0 / 中间值 / 1 画面检查和 Shader 检查。如后续获准改表,再将测试 RoleId 行的 FullScreenEffect 指向 MI,保存并记录修改/恢复范围;当前任务不执行此步骤。
  6. 进入 PIE 后使用 TeleportV2FlowToggle,参数 1、true、on 等开启。默认开关是 false;只有 ActiveTrigger 入口与开关同时满足才走 V2。开关开启不意味着所有传送入口都变成 V2。
  7. TeleportV2TestMainCity 会触发真实服务器传送,不是本地纯动画预览。使用前确认账号、目标地图和服务器环境允许测试;要看材质单帧时先使用材质预览/受控场景,不误用真实传送 GM。
  8. 测试结束记录配置是否恢复、开关状态、日志与画面证据。资源保存、表配置、Shader、PIE 和打包结果分别记录,不合并成一个“通过”。

6.10 本轮验收步骤与记录要求(待执行项)

步骤执行/检查应记录的证据与判读
1. 记录基线角色 RoleId、DT 两项引用、All 四段真实范围、引擎版本、当前开关和入口类型。确认是 None 黑屏基线还是获准配置 MI 的测试;不能混用两组截图。
2. Shader 与静态画面检查母材质/实例编译;在同机位查看 CoverProgress 0、中间值、1,叠加 UI / 相机后处理再比较。记录编译状态、实际值、场景遮挡、UI 层级和图像;逻辑 ready 不代替截图。
3. 入口进退录制真实入口:200ms 盖住→ready→请求→Seq1 首帧 Scrub→200ms 露出;记录公共黑屏是否重叠。检查早露场景、残黑、闪帧、光环/粒子残留和高优先级 Volume 叠加;不以固定时长推导自然度通过。
4. 四段顺序分别第一圈内就绪、多圈等待、圈尾边界就绪,检查 FinishingLoop、Transition、TransitionFinished、Landing 日志和画面。当前圈不被中途截断;第 3 段正式播放后才球体移动,第 4 段独立容器落地;圈尾刚错过可能再等一圈,记录真实时序。
5. 事件与绑定逐段检查角色/武器;重复 Seq02;观察 Transition 事件次数、时刻、对象与收束;检查 PIE 提示。普通循环不能误触发退出特效,不能出现漏 Player 默认角色重影;发现事件重复/漏发应记录,不能假称 EffectFired 门禁已拦住。
6. 回退边界在获准的测试配置下区分无四段/非法范围、重叠、间隙、All 加载失败、FullScreenEffect=None/无效。分别验证独立资源回退、仅报错继续、不校验、失败恢复、原黑屏兜底;不得统一写成“都自动回退”。
7. 生命周期与失败同图/跨图、取消、World 切换、旧异步迟到、入口超时或落地交接失败,之后再发起一轮。检查 MID / Volume、监听/计时器、相机、输入与玩家状态恢复,不残留遮挡、不污染新代次。
8. 资源与性能检查正式引用、Temp 依赖、Cook/打包及后处理开销。按实际测试记录 CPU/GPU/内存与打包状态;资源保存和类型检查通过不代表这些通过。

旧文验收矩阵保留的是较完整的历史方案目标,其中 ExitArmed / EffectFired 等未实现项不能套成已通过断言。本轮先按以上真实实现验收;额外门禁需求另行立项/实现,不在文档里补造事实。

2026-09-29 资源与编辑器实测结果

资源保存、SM6 编译及编辑器表现预览已完成;PIE / 真实传送未验证。验收时 PIE 已结束,用户选择“先完成资源和文档”,因此没有重新启动游戏或执行服务器传送。当前不宣称真实传送全屏遮盖、四段事件或全部绑定已验收通过。

检查项实际结果范围与限制
资产保存M_PP_Teleport_FullScreenTest 与 MI_PP_Teleport_FullScreenTest 均已保存并能加载。没有覆盖 Temp 目录中的既有资源;MI 默认 CoverProgress=0。
ShaderUE 5.7.4,母材质与实例的 SM6 / High 均 found=true、shader_map_ready=true,pending_assets_global=0,CompileErrors=[]。此前 SM5 查询 shader_map_ready=false,即使错误列表为空也不能认定 SM5 通过;移动端、其他质量档与 Cook 未验证。
编辑器画面Launch 地图 LevelEditor 视口 1332×720,临时 Unbound Volume + MID,按 0 → 0.5 → 1 → 1 → 0.5 → 0 分次截图。中间值与全盖值均显示蓝青色光环及屏幕粒子;两张全盖图的光环/粒子位置变化,确认时间动画生效;归零后恢复原始黑色背景。该视口原始场景为黑色,无法靠这组画面证明复杂明亮场景被完全遮盖。左下角坐标轴是编辑器叠加层,不是材质残留;游戏 UI 层级未验证。
连续进退编辑器逐 Tick 执行一次 200ms 进场、持有、200ms 退场参数驱动,回调结束无异常。未录制连续视频,不能将离散截图和无异常等同于真实入口节奏、帧率或无闪帧验收。
清理临时 Volume 已销毁,剩余同一对象查询为空;Slate 回调已注销,临时状态已移除,原选择已恢复。未保存地图;测试改变只作用于临时 MID,没有把 0.5 或 1 写回 MI。
DT 与业务本次不改 DT,FullScreenEffect 仍为 None;前序诊断清理后的定向 ESLint 与 npm run tsc-native 已通过。新材质尚未接入真实传送。All / Player / 事件本轮未重新验收,不能以材质预览替代。
交付边界新增两项资源与本页独立追加章节;未提交 P4。复杂场景遮挡、不同宽高比、真实入口/跨图切换、UI、性能、Cook/打包仍待后续联调。

本轮截图保留在 D:\zhaozibo_071\Source\Client\TypeScript\Script\Temp\:teleport_fullscreen_zero_20260929.png、teleport_fullscreen_half_20260929.png、teleport_fullscreen_full_20260929.png、teleport_fullscreen_full_motion_20260929.png、teleport_fullscreen_exit_half_20260929.png、teleport_fullscreen_restored_20260929.png。仅作本地预览证据;按要求正文配图位置继续留空,不把编辑器截图标成 PIE 截图。

此处需配图:本轮 SM6 编译结果及编辑器 0 / 0.5 / 1 预览,注明 Launch 黑色背景与验证限制;后续游戏实测证据另补,不能混标。