9.2 KiB
高级 III 导览
高级 III 不提供新的玩法接口,它解决的是「改动应该落在哪里」。同一段逻辑写进插件、事件、寻路、录像或加载,代码都能运行,但会在读档、回放或换楼层时表现出完全不同的结果。本层把数据端的装配、依赖、收集、执行、通行与存储拆开讲,帮助你在动手前判断归属。
本页只做导航:说明这一层给谁读、与高级 I / II 的边界、七篇正文的分工与阅读顺序。具体机制不在这里展开,遇到系统细节时直接翻对应篇目。
高级 III 是给谁的
- 能读懂项目里的类型签名,知道一个接口大致约束了哪些能力。
- 手里有一个具体改动,需要先判断它属于装配、插件、事件、寻路、录像还是加载。
- 正在排查存档、回放或加载不一致,想弄清数据是在哪一步丢掉的。
- 接受固定顺序:对象构造、插件阶段、资源加载与读档各有自己的时间线,不能随意互换。
如果只是新增一个事件动作或调用一次寻路,高级 I / II 已经足够。本层适合在改机制之前查阅,也适合在排查「看起来能跑、换一个场景就坏」的问题时建立模型。
与高级 I、高级 II 的区别
| 层级 | 回答的问题 | 典型内容 |
|---|---|---|
| 高级 I | 扩展机制怎么接进来 | 插件、可存档内容、录像一致性、移动器、钩子 |
| 高级 II | 某个具体系统怎么改 | 寻路用法、自定义录像指令、点事件、装备系统 |
| 高级 III | 为什么这样拆、数据怎么流、失败会落在哪一步 | 装配顺序、依赖图、收集与执行、通行与存储 |
三层是难度标签,不是领域分类。同一个功能可能同时涉及插件写法(I)、业务系统(II)与装配顺序(III);区别在于本层解释的是「为什么这个位置不能换」,而不是「这个接口怎么调」。
阅读时先做的三个判断
进入某一篇之前,先回答三个问题,能避免把页面当成接口清单来读:
- 这次改的是定义、进度、执行还是启动? 定义落在仓库,进度落在可存档状态,执行落在系统层,启动落在加载与插件阶段。判断错层,代码往往能跑,但读档或换楼层时才暴露。
- 对象由谁持有、谁负责创建? 同一个能力挂在主对象、插件还是事件环境上,生命周期完全不同。先确认持有者,再看它什么时候被构造。
- 失败会出现在哪一步? 构造期是
undefined,加载期是配置为空,读档期是 key 缺失,运行期是状态不一致。页面里的「边界」一节通常就是按这个顺序组织的。
这三个判断不替代系统细节;它们只是帮助你在七篇正文里找到正确的入口。
前置
建议先读完高级 I 导览与高级 II 导览。以下四篇会被反复引用:
CoreState 是本层多数页面的隐性前置:事件、录像与寻路都建立在四层已经装配完成这一前提上。没有这个前提,后面的「收集」「构图」「播放」都会变成孤立的接口说明。
七篇地图
| 篇目 | 它回答的问题 | 什么时候读 |
|---|---|---|
| CoreState 组装与初始化 | 四层为什么这样分、构造顺序与入口各自负责什么 | 新增子系统、排查装配顺序或对象缺失时 |
| 插件内部机制 | 插件表怎么变成确定顺序、状态怎么推进、依赖写错会怎样 | 插件没有执行、阶段顺序不对或要声明依赖时 |
| 事件系统 | 坐标如何变成候选事件、触发器在哪一步过滤、返回值怎么折叠 | 事件不触发、收集顺序不对或要新增内建函数时 |
| 通行性谓词与寻路原理 | 一个谓词如何同时服务移动与构图、三种移动结果从哪来 | 改通行规则、排查「寻路能走但勇士不能走」时 |
| 录像系统底层 | 输入如何被记录、二进制录像如何布局、播放如何消费读取流 | 新增录像行为、排查回放不一致或读取流过期时 |
| 加载系统 | 资源如何分批加载、阶段之间允许追加什么、配置怎么读取 | 扩展加载内容、排查加载时机或进度问题时 |
| 高级 III 导览 | 本层给谁读、各页负责什么、遇到问题先翻哪里 | 第一次进入本层,或需要确认阅读顺序时 |
表的顺序就是原理线的顺序:先建立对象图与生命周期,再进入插件、事件、通行、录像,最后才是加载。加载放在最后,不是因为不重要,而是它依赖前面几层已经能独立解释。
阅读路径
- 原理线:CoreState → 插件内部机制 → 事件系统 → 通行与寻路 → 录像 → 加载。适合一次把数据端的结构与主数据流打通。
- 按需线:先读 CoreState,建立分层与装配顺序,再跳到当前问题对应的页面。除 CoreState 外,各页可以独立阅读,但都需要假设「四层已装配完成」。
- 排查线:回放不一致先看录像,再看 CoreState 的装配前提;事件不触发先看事件系统的收集与执行;寻路结果与实际移动不符先看通行页的谓词与默认实现;加载时机不对直接看加载系统。
怎么使用这一层
- 先读模型,再看接口:每页开头的角色表与流程图是整页的骨架;先知道谁负责什么,再去看方法名,才不会把「某个类有哪些成员」当成设计。
- 示例按任务读:示例通常展示一个完整链路,而不是单个方法。读的时候先看它解决什么问题,再看它把哪几步串起来,最后看它在哪里接入现有系统。
- 边界当排查入口:每页末尾的「边界与注意」列的是真实失败模式。遇到「能跑但结果不对」时,先从边界里找对应现象,再回到正文确认模型。
- 跨页概念先查归属:同一个词在不同页面可能有不同职责;不确定某段逻辑该由谁解释时,先看「跨页约定」表,避免在错误页面里找实现。
本层不要求你记住所有接口;它要求你在改动前能说出「这个对象属于哪一层、谁创建它、失败会在哪一步出现」。具体签名回到类型声明或高级 I / II 的对应页面。
跨页约定
| 概念 | 归属页 | 其它页只做什么 |
|---|---|---|
| 四层职责、构造顺序、入口、插件装配 | CoreState | 默认读者已经拿到装配完成的实例 |
dataDeps、拓扑序、状态机与三阶段 |
插件内部机制 | 只引用「依赖先完成同一阶段」 |
| 事件仓库、触发器、收集顺序、执行器、内建函数 | 事件系统 | 只说明事件对象如何被脚本执行 |
| 通行谓词、默认实现、构图、搜索、系统层 | 通行与寻路 | 只说明三种移动结果对应哪些触发器 |
录像步、IReplayArray、指令、沙箱、读取流 |
录像 | 只说明回放会重新走同一套游戏逻辑 |
| 加载任务、阶段、配置、自定义内容、进度 | 加载系统 | 只说明加载器在启动流程中的位置 |
| 可存档对象形状、执行器与压缩 | 高级 I | 本层只在装配或读档边界处引用 |
统一术语:装配指构造期建对象,加载指资源加载,读档指从存档恢复状态。三者不是同一件事;本层把「构造」与「加载」严格分开,避免把 new CoreState 当成数据已经可读。
本层不覆盖什么
- 渲染端的结构、动画与输入处理;这里只讲数据端。
- 编辑器、内容配置格式与资源制作流程。
- 完整 API 签名清单;接口只在解释机制时出现。
- legacy 引擎的接口细节;旧实现只作为对比基线,不逐项复述。
- 高级 I / II 已经讲过的插件写法、存档实现、寻路用法与录像指令注册步骤。
返回高级 III 导览。