# Godot设置系统 **本文引用的文件** - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs) - [GodotGraphicsSettings.cs](file://GFramework.Godot/setting/GodotGraphicsSettings.cs) - [AudioBusMapSettings.cs](file://GFramework.Godot/setting/AudioBusMapSettings.cs) - [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs) - [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs) - [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs) - [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs) - [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs) - [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs) - [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs) - [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs) - [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs) - [README.md(Godot设置模块)](file://GFramework.Godot/setting/README.md) - [README.md(设置系统)](file://GFramework.Game/setting/README.md) - [AbstractGodotModule.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考量](#性能考量) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向Godot引擎的游戏设置系统,围绕GodotAudioSettings、GodotGraphicsSettings与AudioBusMapSettings三大核心组件,系统阐述音频设置管理(音量控制、音频总线映射、设备选择)、图形设置实现(分辨率、帧率、渲染质量)、以及设置系统在Godot中的集成方式与最佳实践。文档同时提供完整的使用示例与配置指南,帮助开发者快速落地并维护高质量的设置系统。 ## 项目结构 Godot设置系统由“通用设置框架”与“Godot特定实现”两层构成: - 通用层:定义设置接口、模型、系统与持久化能力,位于GFramework.Game与GFramework.Game.Abstractions。 - Godot层:针对Godot引擎的音频与图形设置实现,位于GFramework.Godot。 ```mermaid graph TB subgraph "通用设置框架" A["ISettingsSystem
ISettingsModel
ISettingsData
IApplyAbleSettings"] B["SettingsSystem"] C["SettingsModel"] D["SettingsPersistence"] E["GraphicsSettings
AudioSettings"] end subgraph "Godot特定实现" F["GodotGraphicsSettings"] G["GodotAudioSettings"] H["AudioBusMapSettings"] end A --> B A --> C A --> D E --> C F --> A G --> A H --> G ``` 图表来源 - [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs#L1-L32) - [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12) - [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14) - [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32) - [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32) - [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103) - [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141) - [GodotGraphicsSettings.cs](file://GFramework.Godot/setting/GodotGraphicsSettings.cs#L1-L43) - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs#L1-L47) - [AudioBusMapSettings.cs](file://GFramework.Godot/setting/AudioBusMapSettings.cs#L1-L38) 章节来源 - [README.md(设置系统)](file://GFramework.Game/setting/README.md#L1-L204) - [README.md(Godot设置模块)](file://GFramework.Godot/setting/README.md#L1-L581) ## 核心组件 - 音频设置(GodotAudioSettings) - 负责将AudioSettings中的主音量、BGM音量、SFX音量应用到Godot音频总线。 - 通过AudioBusMapSettings映射到具体的总线名称,并进行线性音量到分贝的转换。 - 图形设置(GodotGraphicsSettings) - 负责将GraphicsSettings中的分辨率、全屏状态应用到DisplayServer。 - 在非全屏模式下自动居中窗口。 - 音频总线映射(AudioBusMapSettings) - 定义Master、BGM、SFX三类音频总线的名称,默认值分别为"Master"、"BGM"、"SFX"。 - 支持自定义映射,便于多语言或多项目复用。 章节来源 - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs#L1-L47) - [GodotGraphicsSettings.cs](file://GFramework.Godot/setting/GodotGraphicsSettings.cs#L1-L43) - [AudioBusMapSettings.cs](file://GFramework.Godot/setting/AudioBusMapSettings.cs#L1-L38) - [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32) - [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32) ## 架构总览 设置系统采用“模型-系统-应用器”的分层架构: - SettingsModel:集中管理ISettingsData与IApplyAbleSettings两类设置节。 - SettingsSystem:统一调度ApplyAll/Apply等方法,触发事件并捕获异常。 - SettingsPersistence:提供设置的加载、保存、删除与批量操作。 - Godot实现:GodotAudioSettings与GodotGraphicsSettings分别对接Godot引擎API。 ```mermaid sequenceDiagram participant App as "应用" participant Model as "SettingsModel" participant Sys as "SettingsSystem" participant Aud as "GodotAudioSettings" participant Gra as "GodotGraphicsSettings" App->>Model : 获取设置节(GetData/Register) App->>Sys : ApplyAll()/Apply(...) Sys->>Model : TryGet(type) Model-->>Sys : 返回ISettingsSection Sys->>Sys : 发送SettingsApplyingEvent alt IApplyAbleSettings Sys->>Aud : Apply() 或 Gra : Apply() Aud-->>Sys : 完成 Gra-->>Sys : 完成 Sys->>Sys : 发送SettingsAppliedEvent else 非可应用设置 Sys-->>App : 忽略 end ``` 图表来源 - [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103) - [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs#L1-L31) - [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs#L1-L41) - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs#L1-L47) - [GodotGraphicsSettings.cs](file://GFramework.Godot/setting/GodotGraphicsSettings.cs#L1-L43) ## 详细组件分析 ### 音频设置管理(GodotAudioSettings) - 功能要点 - 将AudioSettings中的音量值应用到Godot音频总线。 - 通过AudioBusMapSettings映射到具体总线名称。 - 将线性音量转换为分贝并设置到对应总线索引。 - 若总线不存在,记录警告并跳过设置。 - 数据流 - 输入:AudioSettings(主音量、BGM音量、SFX音量)+ AudioBusMapSettings(总线名称)。 - 处理:根据总线名称查询索引,线性值转分贝,调用AudioServer.SetBusVolumeDb。 - 输出:音频总线音量生效。 - 错误处理 - 总线不存在时发出警告,不抛出异常,保证设置流程继续。 ```mermaid flowchart TD Start(["进入 Apply"]) --> GetBuses["读取总线映射
Master/BGM/SFX"] GetBuses --> Loop{"遍历每个总线"} Loop --> |是| FindIdx["AudioServer.GetBusIndex(name)"] FindIdx --> Found{"索引>=0?"} Found --> |否| Warn["记录警告并跳过"] Found --> |是| Clamp["Clamp(线性音量, 0.0001, 1)"] Clamp --> Db["LinearToDb"] Db --> SetVol["SetBusVolumeDb(idx, db)"] SetVol --> Loop Loop --> |否| Done(["完成"]) ``` 图表来源 - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs#L18-L46) 章节来源 - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs#L1-L47) - [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32) - [AudioBusMapSettings.cs](file://GFramework.Godot/setting/AudioBusMapSettings.cs#L1-L38) ### 图形设置实现(GodotGraphicsSettings) - 功能要点 - 设置窗口边框(全屏时无边框)。 - 切换窗口模式(全屏ExclusiveFullscreen或窗口化Windowed)。 - 非全屏时设置窗口尺寸并自动居中。 - 数据流 - 输入:GraphicsSettings(分辨率宽高、全屏开关)。 - 处理:构建Vector2I,设置WindowFlags与WindowMode;若非全屏则设置Size与Position。 - 输出:窗口尺寸与模式生效。 - 注意事项 - 全屏切换涉及系统调用,建议避免频繁切换。 - 分辨率应不超过显示器支持范围。 ```mermaid flowchart TD Start(["进入 Apply"]) --> BuildSize["创建Vector2I(width,height)"] BuildSize --> Border["设置Borderless标志=Fullscreen"] Border --> ModeSel{"Fullscreen ?"} ModeSel --> |是| Full["设置为ExclusiveFullscreen"] ModeSel --> |否| Win["设置为Windowed 并设置Size"] Win --> Center["获取屏幕尺寸并计算居中位置"] Center --> Pos["设置WindowPosition"] Full --> End(["完成"]) Pos --> End ``` 图表来源 - [GodotGraphicsSettings.cs](file://GFramework.Godot/setting/GodotGraphicsSettings.cs#L16-L42) 章节来源 - [GodotGraphicsSettings.cs](file://GFramework.Godot/setting/GodotGraphicsSettings.cs#L1-L43) - [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32) ### 音频总线映射机制(AudioBusMapSettings) - 功能要点 - 定义三类音频总线名称:Master、BGM、SFX。 - 提供Reset方法恢复默认值。 - 可自定义映射以适配不同项目命名规范。 - 与Godot集成 - 与GodotAudioSettings配合,将配置音量映射到实际总线。 - 建议在项目中预先创建对应总线,避免运行时报错。 ```mermaid classDiagram class AudioBusMapSettings { +string Master +string Bgm +string Sfx +Reset() } class GodotAudioSettings { +Apply() Task -SetBus(busName, linear) } AudioBusMapSettings --> GodotAudioSettings : "提供总线名称" ``` 图表来源 - [AudioBusMapSettings.cs](file://GFramework.Godot/setting/AudioBusMapSettings.cs#L1-L38) - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs#L1-L47) 章节来源 - [AudioBusMapSettings.cs](file://GFramework.Godot/setting/AudioBusMapSettings.cs#L1-L38) ### 设置系统集成与事件机制 - SettingsModel - 统一管理ISettingsData与IApplyAbleSettings两类设置节。 - 支持GetData()自动创建与RegisterApplicator()注册。 - SettingsSystem - ApplyAll/Apply()按类型获取并应用设置。 - 发送SettingsApplyingEvent与SettingsAppliedEvent,便于监听与调试。 - 捕获异常并回传错误信息。 - SettingsPersistence - 提供LoadAsync/SaveAsync/DeleteAsync/SaveAllAsync等异步持久化能力。 - 事件驱动:加载/保存/批量保存均触发相应事件。 ```mermaid classDiagram class ISettingsSystem { +ApplyAll() Task +Apply(Type) Task +Apply() Task +Apply(IEnumerable) Task } class SettingsSystem { -_model ISettingsModel +ApplyAll() Task +Apply(Type) Task +Apply() Task +Apply(IEnumerable) Task -TryApply(section) } class ISettingsModel { +GetData() T +RegisterApplicator(applicator) +GetApplicator() +TryGet(type, out section) bool +All() IEnumerable } class SettingsModel { -_applicators Dictionary -_dataSettings Dictionary +GetData() +RegisterApplicator() +GetApplicator() +TryGet(type, out section) bool +All() IEnumerable } class ISettingsData { +Reset() } class IApplyAbleSettings { +Apply() Task } class SettingsPersistence { +LoadAsync() +SaveAsync() +DeleteAsync() +SaveAllAsync() +ExistsAsync() } ISettingsSystem <|.. SettingsSystem ISettingsModel <|.. SettingsModel ISettingsData <|-- AudioSettings ISettingsData <|-- GraphicsSettings IApplyAbleSettings <|-- GodotAudioSettings IApplyAbleSettings <|-- GodotGraphicsSettings SettingsSystem --> ISettingsModel : "依赖" SettingsModel --> ISettingsData : "管理" SettingsModel --> IApplyAbleSettings : "管理" SettingsPersistence --> IStorage : "依赖" ``` 图表来源 - [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs#L1-L32) - [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99) - [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12) - [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103) - [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141) - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs#L1-L47) - [GodotGraphicsSettings.cs](file://GFramework.Godot/setting/GodotGraphicsSettings.cs#L1-L43) - [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32) - [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32) 章节来源 - [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103) - [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141) - [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs#L1-L31) - [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs#L1-L41) ## 依赖分析 - 组件耦合 - GodotAudioSettings与AudioBusMapSettings强耦合(组合关系),弱耦合于AudioSettings。 - GodotGraphicsSettings直接依赖Godot DisplayServer API。 - SettingsSystem仅依赖ISettingsModel与事件接口,保持低耦合。 - 外部依赖 - Godot引擎:AudioServer、DisplayServer。 - 存储:ISettingsPersistence依赖IStorage接口,具体实现可替换。 ```mermaid graph LR Aud["GodotAudioSettings"] --> Bus["AudioBusMapSettings"] Aud --> AS["AudioSettings"] Gra["GodotGraphicsSettings"] --> GS["GraphicsSettings"] Sys["SettingsSystem"] --> Mod["SettingsModel"] Mod --> IF1["ISettingsData"] Mod --> IF2["IApplyAbleSettings"] Sys --> EV["事件: Applying/Applied"] ``` 图表来源 - [GodotAudioSettings.cs](file://GFramework.Godot/setting/GodotAudioSettings.cs#L1-L47) - [GodotGraphicsSettings.cs](file://GFramework.Godot/setting/GodotGraphicsSettings.cs#L1-L43) - [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99) - [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103) ## 性能考量 - 音频设置 - 总线查找为O(1),音量转换开销极小;建议批量应用多个音量设置以减少重复调用。 - 图形设置 - 窗口操作涉及系统调用,相对较慢;分辨率变更可能触发窗口重建;避免频繁切换显示模式。 - 持久化 - 使用异步文件I/O;可考虑设置变更防抖与压缩以降低I/O开销。 章节来源 - [README.md(Godot设置模块)](file://GFramework.Godot/setting/README.md#L501-L520) ## 故障排除指南 - 音频总线未找到 - 现象:日志出现“Audio bus not found: ...”警告。 - 解决:在Godot项目中创建对应总线,确保名称与AudioBusMapSettings一致。 - 分辨率设置无效 - 现象:分辨率无法设置到指定值。 - 解决:检查分辨率是否超出显示器支持范围;使用DisplayValidator进行安全检查。 - 全屏模式问题 - 现象:全屏切换失败。 - 解决:检查是否在调试器中运行,某些全屏模式在调试时不可用。 章节来源 - [README.md(Godot设置模块)](file://GFramework.Godot/setting/README.md#L521-L574) ## 结论 Godot设置系统通过清晰的分层设计与事件驱动机制,实现了音频与图形设置的可配置、可应用与可持久化。GodotAudioSettings与GodotGraphicsSettings分别对接Godot引擎API,结合AudioBusMapSettings与SettingsSystem,形成稳定高效的设置管理闭环。遵循本文最佳实践与故障排除建议,可显著提升设置系统的可靠性与可维护性。 ## 附录 ### 设置系统在Godot中的集成方式 - 模块化接入 - 通过AbstractGodotModule定义Godot节点与生命周期钩子,将设置系统作为模块安装到架构中。 - 设置注册与应用 - 在SettingsModel中注册GodotAudioSettings与GodotGraphicsSettings实例。 - 通过SettingsSystem.ApplyAll()统一应用所有可应用设置。 - 事件监听 - 订阅SettingsApplyingEvent与SettingsAppliedEvent,实现UI反馈与日志记录。 章节来源 - [AbstractGodotModule.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs#L1-L55) - [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99) - [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs#L1-L31) - [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs#L1-L41) ### 配置文件格式与持久化策略 - 存储键命名 - 采用“Settings_类型名称”的键规则,便于区分与检索。 - 异步I/O - LoadAsync/SaveAsync/DeleteAsync/SaveAllAsync均使用异步操作,避免阻塞主线程。 - 批量操作 - SaveAllAsync支持批量保存,减少多次I/O调用。 - 兼容性处理 - 不存在键时自动创建新实例;支持Reset方法恢复默认值。 章节来源 - [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141) ### 设置使用示例与配置指南 - 音频设置 - 基本配置:设置主音量、BGM音量、SFX音量,创建GodotAudioSettings并调用Apply。 - 自定义总线映射:通过AudioBusMapSettings自定义总线名称,再应用设置。 - 通过设置系统使用:在SettingsModel中获取AudioSettings,创建GodotAudioSettings并应用。 - 图形设置 - 基本配置:设置分辨率与全屏状态,调用Apply。 - 窗口模式切换:切换Fullscreen属性并重新应用。 - 预设分辨率:使用常见分辨率数组,封装ApplyResolution方法。 章节来源 - [README.md(Godot设置模块)](file://GFramework.Godot/setting/README.md#L83-L211) - [README.md(设置系统)](file://GFramework.Game/setting/README.md#L63-L96)