首页 / 大项目模块 / 传送 / 重构文档

TeleportController 重构 · 第一次:结构拆分

本文记录 2026-09-07 的第一次重构:把 TeleportController 从 3526 行收敛到 467 行,保留稳定门面与外部入口;表现、地面探测、同场景流程、过场序列、Seq3 绑定和转场编排分别进入独立对象。

2026-09-07 3526 → 467 行 6 个子职责 PIE 功能回归待测
本文只记录第一次重构 第二次重构(2026-10-12 · 流程命令化与 V2 拆分)把传送表现改为分阶段命令驱动,并把 V2 单体拆为流程 / 组装器 / 命令 / 协作类,见 TeleportController 重构 · 第二次:流程命令化与 V2 拆分。两页相互独立,可分开阅读。

1. 第一次重构结果(2026-09-07)

文件行数重构后定位
TeleportController.ts467稳定门面、网络入口、相机事件处理与 Tick(帧更新)转发
TeleportPresentation.ts379玩家显隐、输入与主界面控制、相机复位、淡入淡出、黑屏与无缝遮罩
TeleportGroundProbe.ts1533×3 地面可用性探测、贴地位置计算、重试与超时放行
TeleportSameSceneFlow.ts521同场景通知接管、移动锁、流送命令、LoadDone 上报重试、协议缓存收尾
TeleportSequenceFlow.ts654过场关卡与 Seq1/Seq2/Seq3 资源、角色和相机绑定、播放与卸载
TeleportSeq3Binder.ts666Seq3 真实角色绑定、换装等待、移动模拟冻结、逐帧纠正、尾段融合与还原
TeleportTransitionFlow.ts601传送类型分流、上升/下降技能、跨场景与淡入淡出编排、入场等待和统一结束

本次拆分新增 2974 行职责明确的协作对象;控制器减少 3059 行。行数变化来自代码迁移与边界显式化,不代表删减传送功能。

2. TeleportController 保留的边界

TeleportController 继续作为外部系统可见的控制器,不把调用方迁移成本扩散到全工程。它只保留以下四类工作:

保留项具体内容为什么留在门面
门面接口OnStartUp、OnStartLoad、OnStartDown、OnEnd、显隐与淡入淡出等既有公开方法外部调用路径和控制器注册方式保持不变
网络入口WorldTeleportEnterSCNotify 与 WorldSyncDirPosSCNotify 的注册、注销和首层转发协议生命周期仍跟随控制器
相机事件TeleportDownCameraTransition 的曲线组装、剩余时长限制和相机复位调用该事件同时连接控制器公开能力与 Seq3 状态
Tick(帧更新)转发OnPostUpdateWorkTick 只调用 SequenceFlow.Tick()控制器继续接入框架帧更新,具体逻辑下沉

3. 子职责划分

3.1 表现与地面探测

TeleportPresentation 统一管理可见性、输入、主界面、相机、黑屏、无缝遮罩和材质淡入淡出;TeleportGroundProbe 只依赖物理查询与计时器,负责“地面是否真的可站”和“角色应贴到哪个高度”。表现状态与物理判定不再混入流程编排。

3.2 三条流程与一个绑定器

对象持有的状态完成时输出
TeleportSameSceneFlow同场景流送、相机朝向等待、移动锁、LoadDone 重试、缓存原因与流程代次发出流送完成事件,清理遮罩与缓存
TeleportTransitionFlow吟唱/上升/下降等待、入场双层超时、流送完成监听、淡入淡出代次统一结束传送并发出开始/结束事件
TeleportSequenceFlow过场关卡、序列播放器、替身角色、序列相机和待应用材质完成过场加载、Seq3 播放与资源卸载
TeleportSeq3Binder真实角色绑定快照、换装与重绑计时器、落点锚点、尾段相机支点还原角色、碰撞、移动同步、移动模拟和流送锁

4. 依赖方向

外部调用 / 网络通知 / 相机事件
                ↓
        TeleportController
          ├─ TeleportPresentation
          ├─ TeleportGroundProbe
          ├─ TeleportSameSceneFlow ──→ Presentation + GroundProbe
          ├─ TeleportSequenceFlow  ──→ GroundProbe + TeleportSeq3Binder
          └─ TeleportTransitionFlow ─→ Presentation + SameSceneFlow + SequenceFlow

依赖由门面向子对象单向建立。子流程不反向持有 TeleportController,需要的少量跨边界能力通过构造参数中的回调接口注入。TeleportGroundProbe 与 TeleportPresentation 是底层能力;TeleportTransitionFlow 位于编排层。

5. 回调治理

治理点落地方式解决的问题
显式依赖三个流程类分别声明只读回调接口,构造时由门面注入子对象只看到所需能力,避免获取整个控制器并形成反向依赖
稳定函数引用事件与协议处理继续使用只读箭头函数属性注册与注销使用同一引用,兼容事件系统的弱引用行为
一次完成序列换装、轨道重绑等异步路径使用完成标志,保证回调只触发一次正常完成、超时和对象失效同时到达时不重复收尾
成对取消计时器句柄、事件注册状态和异步解析函数都有独立清理方法新流程开始、OnEnd 或 Clear 时可撤销旧等待
流程代次FlowGeneration 与 FadeGeneration 标识当前流程旧异步回调晚到时会被丢弃,不再污染新一轮传送
统一恢复过场失败、Seq3 结束、控制器清理分别进入明确的恢复出口输入、界面、遮罩、移动模拟、碰撞和流送锁可完整归还

6. 迁移阶段

阶段迁移内容边界结果
阶段 1抽出 TeleportPresentation 与 TeleportGroundProbe先隔离表现副作用和物理探测,减少控制器中的工具型方法
阶段 2抽出 TeleportSameSceneFlow同场景通知、流送、移动锁、LoadDone 和协议缓存形成闭环
阶段 3抽出 TeleportSequenceFlow过场关卡与三段序列的资源生命周期独立
阶段 4从序列流程中再拆出 TeleportSeq3Binder真实角色绑定、落点纠正和还原不再挤占序列装载代码
阶段 5抽出 TeleportTransitionFlow,控制器改为转发传送类型和表现路径的编排集中到单一流程对象,门面稳定
阶段 6统一清理入口、代次校验和构造回调各子对象可独立结束自己的事件、计时器与临时状态

7. 保留的不变量

8. 验证结果

检查项结果覆盖范围
Prettier(代码格式化)通过本次 7 个 TypeScript(类型脚本)文件
ESLint(静态检查)0 error本次改动文件
npm run tsc-native通过原生 TypeScript(类型脚本)编译链
JavaScript(脚本)产物7 个已更新控制器与 6 个新增职责文件均已生成对应产物
PIE(编辑器内运行)功能回归待测同关卡、跨关卡、传送点、复活、淡入淡出、Seq3 与异常兜底路径

静态检查与编译产物验证已经完成;当前结论只证明代码可格式化、可检查、可编译且产物已刷新,不能替代 PIE(编辑器内运行)中的功能回归。功能行为仍需按现网入口逐项验证。