# GFramework.Game.Abstractions `GFramework.Game.Abstractions` 是 `GFramework` 游戏层的契约包。 它建立在 `GFramework.Core.Abstractions` 之上,只定义接口、枚举、路由上下文、事件契约和少量可直接复用的数据类型,不提供完整运行时实现。它的主要用途是把游戏业务层、引擎适配层、公共 feature 包与具体实现解耦。 如果你需要可直接运行的默认实现,请改为依赖 `GFramework.Game`。 ## 包定位 - 为游戏相关子系统提供稳定契约,而不是默认实现。 - 适合被多个程序集共同引用,避免公共业务层直接依赖具体运行时。 - 典型使用场景: - 定义 `IScene`、`IUiPage`、`ISettingsData`、`IData` 等业务对象 - 让 feature 包只感知 `IConfigRegistry`、`ISaveRepository`、`ISettingsModel`、`IUiRouter`、`ISceneRouter` - 在引擎适配层之外共享设置、场景参数、UI 参数、存档数据类型 ## 与相邻包的关系 - `GFramework.Core.Abstractions` - 本包直接依赖它。 - 提供 `ISystem`、`IModel`、`IUtility`、上下文 utility 等底层抽象。 - `GFramework.Game` - 本包的主要实现层。 - `FileStorage`、`ScopedStorage`、`JsonSerializer`、`SettingsModel`、`SaveRepository`、`SceneRouterBase`、`UiRouterBase`、`YamlConfigLoader` 等都在实现这里的契约。 - 引擎适配包或项目代码 - `IUiFactory`、`ISceneFactory`、`IUiRoot`、`ISceneRoot`、资源注册表等通常由引擎适配层或游戏项目自己实现。 - 仓库内 `ai-libs/` 下的只读参考实现通常也是这样组织:页面 / 场景 factory、root、registry 在项目层, 运行时基类和契约来自 `GFramework.Game` 与本包。 ## 子系统地图 ### `Config/` 静态内容配置的读取侧契约。 - `IConfigLoader` - `IConfigRegistry` - `IConfigTable` - `ConfigLoadException` - `ConfigLoadDiagnostic` - `ConfigLoadFailureKind` 这一层只描述“如何注册与访问配置表”,不关心底层来自 YAML、二进制还是远程源。 ### `Data/` 可写数据与存档契约。 - `IData` - `IVersionedData` - `IDataLocation` - `IDataLocationProvider` - `IDataRepository` - `ISettingsDataRepository` - `ISaveRepository` - `ISaveMigration` - `DataRepositoryOptions` - `Data/Events/*` 这一层让业务代码不需要知道数据最终按“单文件一项”还是“统一文件多 section”持久化。 ### `Setting/` 设置系统契约。 - `ISettingsData` - `IResetApplyAbleSettings` - `ISettingsModel` - `ISettingsSystem` - `ISettingsMigration` - `ISettingsChangedEvent` - `Setting/Data/*` - 内置了 `AudioSettings`、`GraphicsSettings`、`LocalizationSettings` 三类常见设置数据 这里定义的是“设置生命周期和应用语义”,不限定具体引擎。 ### `Scene/` 场景导航契约。 - `IScene` - `ISceneBehavior` - `ISceneFactory` - `ISceneRoot` - `ISceneRouter` - `ISceneTransitionHandler` - `ISceneAroundTransitionHandler` - `ISceneRouteGuard` - `IGameSceneRegistry` 如果你想把场景定义放在公共业务层,通常依赖本包就够了。 ### `UI/` UI 页面与路由契约。 - `IUiPage` - `IUiPageBehavior` - `IUiFactory` - `IUiRoot` - `IUiRouter` - `IUiTransitionHandler` - `IUiAroundTransitionHandler` - `IUiRouteGuard` - `UiHandle` - `UiTransitionHandlerOptions` - `UiInteractionProfile` `IUiRouter` 不只覆盖页面栈,还覆盖 Overlay / Modal / Toast / Topmost 等层级 UI 语义。 ### `Routing/` - `IRoute` - `IRouteContext` - `IRouteGuard` Scene 与 UI 路由共享这套基础约定。 ### `Storage/` - `IFileStorage` - `IScopedStorage` 它们继承自核心层的 `IStorage`,用于表达“文件存储实现”和“带作用域前缀的存储实现”这两个角色。 ### `Asset/` 与 `Enums/` - `Asset/` - 资源注册表契约,如 `IAssetRegistry` - `Enums/` - UI/Scene 转场、UI 层级、输入动作、存储类型等公共枚举 ## 最小接入路径 ### 1. 只想在公共业务层声明游戏对象 直接依赖本包,定义业务数据和交互参数: ```csharp using GFramework.Game.Abstractions.Data; using GFramework.Game.Abstractions.Scene; using GFramework.Game.Abstractions.UI; public sealed class GameSaveData : IVersionedData { public int Version { get; set; } = 1; public DateTime LastModified { get; set; } = DateTime.UtcNow; } public sealed class GameplayEnterParam : ISceneEnterParam { public required string Seed { get; init; } } public sealed class PauseMenuParam : IUiPageEnterParam { public bool AllowRestart { get; init; } } ``` 这个阶段不需要把 `GFramework.Game` 一起带进来。 ### 2. 只想让 feature 包依赖抽象,不绑定具体实现 直接面向接口编程: ```csharp public sealed class ContinueGameCommandHandler { private readonly ISaveRepository _saveRepository; private readonly ISceneRouter _sceneRouter; public ContinueGameCommandHandler( ISaveRepository saveRepository, ISceneRouter sceneRouter) { _saveRepository = saveRepository; _sceneRouter = sceneRouter; } } ``` 这样 feature 包不必知道底层到底是 `SaveRepository`、Godot 适配层,还是你自己的实现。 ### 3. 什么时候要升级到 `GFramework.Game` 一旦你需要下面任一项,就不该只停留在本包: - 默认的 JSON 序列化实现 - 文件系统存储实现 - 设置模型与系统实现 - 槽位存档仓库实现 - YAML 配置加载器 - Scene / UI 路由基类 也就是说,本包回答的是“项目各层如何约定”,`GFramework.Game` 回答的是“这些约定默认怎么跑起来”。 ## `ai-libs/` 里的参考接入线索 `ai-libs/` 下的只读参考实现对本包的使用方式,能比较清楚地说明它的职责边界: - 公共脚本广泛引用: - `IUiRouter` - `ISceneRouter` - `ISettingsModel` - `ISettingsSystem` - `ISaveRepository` - `IConfigRegistry` - 业务数据和参数实现引用: - `IData` / `IVersionedData` - `ISceneEnterParam` - `IUiPageEnterParam` - 真正的实现和装配则放在: - `GFramework.Game` - `GFramework.Godot.*` - 项目自己的模块、factory、root、registry 这正是本包的设计目标:让业务层依赖稳定契约,而不是依赖具体运行时细节。 ## 对应文档入口 虽然大部分详细文档写在 `GFramework.Game` 侧,但阅读顺序仍然适用于本包: - 游戏模块总览:[docs/zh-CN/game/index.md](../docs/zh-CN/game/index.md) - 内容配置系统:[docs/zh-CN/game/config-system.md](../docs/zh-CN/game/config-system.md) - 数据与存档:[docs/zh-CN/game/data.md](../docs/zh-CN/game/data.md) - 设置系统:[docs/zh-CN/game/setting.md](../docs/zh-CN/game/setting.md) - 存储系统:[docs/zh-CN/game/storage.md](../docs/zh-CN/game/storage.md) - 序列化系统:[docs/zh-CN/game/serialization.md](../docs/zh-CN/game/serialization.md) - 场景系统:[docs/zh-CN/game/scene.md](../docs/zh-CN/game/scene.md) - UI 系统:[docs/zh-CN/game/ui.md](../docs/zh-CN/game/ui.md) ## 选择建议 - 选 `GFramework.Game.Abstractions` - 你在写共享业务层、公共 feature 包、纯契约层 - 选 `GFramework.Game` - 你需要默认实现、基础设施拼装、运行时启动入口 - 两者一起用 - 最常见。公共层依赖 abstractions,应用层或引擎层依赖 runtime