Files
template/docs/advanced/iii/index.md
T

99 lines
9.2 KiB
Markdown
Raw Blame History

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