SuperAPI AI 工具集

godot-game-architecture

编程与开发

查看项目

更新于 10-19 18:16

技能介绍

Godot Game Architecture 是面向 Godot 4.x 项目架构的指导性技能,核心原则是:为每份状态指定唯一的权威所有者,并把它放在能满足游戏流程的最短生命周期内。

用途与范围

适用于按生命周期对状态进行分类,并为每类状态选定唯一的权威写入者;分离静态定义、运行期模拟状态、表现层状态和持久化快照;判断协调器应放在场景中还是 autoload 中;定义管理器职责与公开的修改边界;协调菜单、玩法、结算、重载与浮层之间的场景流程;设计新会话、重置、检查点、保存、读取、迁移与损坏处理行为;防止场景切换时泄漏节点或保留失效引用。

不适用于基础节点选择、场景实例化、自定义资源语法、Input Map 配置或编辑器导航(这些归基础技能);也不负责讲解 SOLID、信号机制、命令或对象池(这些归编程模式技能)。架构技能可以确定事件或组件边界,但具体实现细节由模式技能负责。

设计前检查

先定位 project.godot,检查 config/features 中的 Godot 4.x 目标版本;读取 [application] 确定主场景,读取 [autoload] 盘点进程级节点及其顺序;检查项目现有的场景、脚本、资源与数据布局,沿用既有命名、目录、类型和依赖约定;梳理当前所有场景切换和浮层,记录由谁发起、释放了什么、保留了什么、下一场景期望什么;建立状态清单,为每个值记录写入者、读取者、生命周期、重置规则、定义来源以及是否持久化;搜索对共享字段的直接写入、全局查找、get_tree().root.add_child()、管理器引用、用户文件访问和启动时发射(信号);复现基线流程,包括全新启动、新游戏、场景切换、重试、返回菜单以及保存/读取;在修改 schema 或归属前检查现有测试与存档样本。在评估现有所有者与 autoload 之前,不要新增管理器。

状态分类

区分四类概念:定义数据(被实例共享的编写事实,常见为资源,如物品价格或单位基础速度);运行时状态(该实体、房间、对局或会话的可变事实,如当前生命值或已发现房间);表现状态(短暂的视图细节,如选中的页签、动画进度或可见提示框);快照数据(跨越持久化边界的原始、带版本的值)。切勿用同一个共享资源同时承担这四种角色,尤其不要通过修改定义资源来保存运行进度,否则会影响所有使用者并让存档复杂化。

按生命周期分配归属

选择最近的稳定所有者:实体状态归实体或其某个专注组件;房间/关卡状态归该房间/关卡协调器;对局状态归对局根或被其拥有的对局模型;跨关卡场景的运行状态归能跨越这些切换的会话所有者;档案进度与设置归带明确持久化 API 的档案/设置服务。UI 只显示状态,不应成为权威的玩法存储。每个状态值只允许一个写入者,其他系统通过方法请求修改,并通过读取或事件观察结果;避免所有场景都能直接编辑的公共字典。

管理器生命周期

当状态应随场景消失时,让管理器留在场景内,例如关卡导演、遭遇追踪器或对局裁判通常挂在玩法根下。只有满足以下任一条件时才使用 autoload:该能力必须在当前场景替换前后都存在;多个互不相关的根场景需要同一进程级服务;它自身协调场景替换;它拥有生命周期跨越这些场景的会话/档案状态。autoload 不得在场景退出后保留该场景的普通节点,应存储普通状态、稳定 ID 或重新获取的引用;需提供明确的 start_new_*、reset 和 restore 方法,进程生命周期不等于重置策略。

场景流程

只赋予一个协调器替换当前场景的权限;目标以导出的 PackedScene 或集中路由表表达,避免在 UI 和角色中重复写字符串路径;防止同一帧内多个输入或结束条件触发重复切换;区分替换与浮层两种操作:替换互斥的根场景,暂停、对话框和加载浮层则挂在明确的拥有者下;运行时创建的玩法节点应放在当前场景下,以便替换时被释放;初始化需要新场景中的节点时,等待 SceneTree.scene_changed;场景就绪后主动拉取初始状态,不要依赖可能被后加入者错过的全局启动事件;明确死亡、重试、下一关和返回菜单各自保留还是重置运行状态。

持久化边界

保存快照,而非节点、可调用对象、信号连接或活动资源引用;将游戏对象转换为带稳定 ID 的原始字典/数组;用户数据存于 user://,绝不写入被导入的 res:// 内容;包含 schema 版本,并为每个支持的旧版本定义迁移或拒绝策略;在修改活动状态前校验类型、范围、ID 和必需关系;先恢复到干净的模型,再由该模型构建或更新场景;将磁盘 I/O 和序列化保持在玩法实体之外;定义保存时机与失败行为,避免各子系统独立写入。

实现流程

只为受影响的状态与流程编写归属图;定义权威所有者的最小公开 API;在保持现有行为的前提下让所有修改经由该所有者;让视图从当前快照初始化,再观察后续变化;协调器放在其管理的生命周期层级,不要为方便把场景局部状态提升为 autoload;集中场景替换,并为每条路由定义重置语义;将快照转换、校验、版本化和存储作为独立步骤;待所有读取者都改用权威后,再移除过时的重复状态;测试生命周期与持久化矩阵,而不只是正常路径。

验证

运行现有项目检查,并在相关时覆盖:无用户数据的全新启动;直接运行主场景与经由配置入口场景正常启动;同一进程内上一轮之后的再次新游戏;菜单、玩法、结算、重试、下一关的反复切换;同一帧内两次切换请求;定时器、await 或运行时节点活跃时的场景退出;状态已变化后创建的 UI 仍显示当前值;保存后读取回干净会话;缺失、截断、格式错误、未知版本与部分有效的存档数据;编写内容被重命名或移除时的稳定 ID 解析;档案/设置持久化不误带运行状态;多轮循环后远程场景树和对象数量中不残留旧根或场景引用。报告已验证的状态所有者、重置策略、切换流程与 schema 版本。

常见失败模式

一切皆 autoload:以便利取代归属,应把状态移到最窄的场景或模型生命周期;管理器变成全局杂物袋:不相关系统直接写字段,应拆分内聚能力并暴露修改方法;进入时 UI 过期:它等待了已过去的事件,应在初始化时读取当前状态再订阅变化;新游戏保留旧值:进程级状态缺少显式重置路径;场景切换泄漏角色:节点挂到 current_scene 之上,或被长生命周期对象持有;autoload 调用尚不存在的 HUD 节点:全局初始化早于目标场景就绪,应在 scene_changed 后响应或让场景主动拉取状态;两个所有者不一致:状态在 UI、管理器、实体或资源中重复,应选定一个权威并派生其余;共享定义被修改:作为模板的 .tres 同时保存每轮进度,应拆分定义与运行时模型;读取只应用一半:校验与修改交错,应先解析并校验完整的临时快照;旧存档崩溃:缺少 schema 版本、迁移、默认值或未知 ID 策略;切换字符串漂移:路径散落在按钮与角色中,应集中路由或导出场景资源。