ProcedureModule 与 GameSystem
ProcedureModule 管理游戏的业务阶段切换,ProcedureBase 编排进入和退出,GameSystemBase 承载具体业务数据与逻辑。系统实例、实现绑定、作用域和初始化依赖统一配置在 ProcedureCfg,业务不在 Procedure 中手工 new 或等待一串系统。
子功能
设计思路
Procedure 只负责阶段编排,业务数据和逻辑留在 GameSystem。配置把系统组成、抽象实现、作用域和依赖集中到可视化画布,使“进入某玩法需要哪些系统、哪些能并行、谁依赖谁”可以直接审查。
Ready 状态把异步初始化纳入依赖图;退出屏障则把异步释放纳入流程切换。进入和退出两端都有明确成功边界,避免 Scene 或 Package 还没准备好就进入业务,也避免资源仍被 Entity/UI 持有时提前切换。
Blackboard 只在一个作用域内共享,避免把每个参数扩张成全局单例。Type/BindType 绑定让访问依赖抽象,但不引入隐藏字段注入,调用关系仍然可读。
注意事项
- Procedure 不承载大量业务状态和数据处理;这些属于 GameSystem。
- 每个 GameSystem 初始化必须调用
CompleteInit或FailInit,失败后不能伪造成功回调。 - Dependencies 是系统初始化关系的唯一配置来源,不要复制手工等待逻辑。
- Long 初始化数据写在 OnInit,Short 初始化数据写在 OnPrepare;OnEnter 已经太晚。
- 退出失败必须保持失败,不跳过资源释放继续切换。
- Type、BindType 或程序集名称变化后,应打开 ProcedureCfg Refresh 并修正失效绑定。
- 画布位置不影响调度;列表顺序也不是依赖顺序。
GameSystem.Get<T>()只返回 Ready 实例,调用方仍应处理null,不要把生命周期错误静默当成可选功能。
