# 设置系统 API
**本文引用的文件**
- [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs)
- [ISettingsModel.cs](file://GFramework.Game.Abstractions/setting/ISettingsModel.cs)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs)
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs)
- [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs)
- [ISettingsSection.cs](file://GFramework.Game.Abstractions/setting/ISettingsSection.cs)
- [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs)
- [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs)
- [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs)
- [ISettingsChangedEvent.cs](file://GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs)
- [SettingsChangedEvent.cs](file://GFramework.Game/setting/events/SettingsChangedEvent.cs)
- [SettingsSavedEvent.cs](file://GFramework.Game/setting/events/SettingsSavedEvent.cs)
- [SettingsLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsLoadedEvent.cs)
- [SettingsAllLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsAllLoadedEvent.cs)
- [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs)
- [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录:完整 API 参考](#附录完整-api-参考)
## 简介
本文件为 GFramework.Settings 系统的完整 API 参考文档,覆盖以下主题:
- 设置系统接口 ISettingsSystem 的核心方法:应用设置(ApplyAll/Apply/ApplyAsync)。
- 设置模型 ISettingsModel 的数据结构与访问模式:GetData、TryGet、RegisterApplicator、GetApplicator、All。
- 设置持久化 ISettingsPersistence 的存储机制:LoadAsync、SaveAsync、ExistsAsync、DeleteAsync、SaveAllAsync、LoadAllAsync。
- 设置事件系统:设置变更事件 ISettingsChangedEvent 及其实现(SettingsChangedEvent、SettingsSavedEvent、SettingsLoadedEvent、SettingsAllLoadedEvent、SettingsAppliedEvent、SettingsApplyingEvent)的触发时机与使用方式。
- 设置数据接口 ISettingsData 与设置分区接口 ISettingsSection 的职责边界。
- 具体设置类型:音频设置 AudioSettings、图形设置 GraphicsSettings 的 API 说明。
- 常见场景示例:创建自定义设置、实现设置验证、处理设置同步。
## 项目结构
设置系统由“抽象层”和“实现层”组成:
- 抽象层(GFramework.Game.Abstractions)定义接口与数据契约,确保跨平台/引擎解耦。
- 实现层(GFramework.Game)提供具体实现:SettingsSystem、SettingsModel、SettingsPersistence,以及事件与具体设置类型。
```mermaid
graph TB
subgraph "抽象层"
ISystem["ISettingsSystem 接口"]
IModel["ISettingsModel 接口"]
IContextUtility["ISettingsPersistence 接口"]
ISettingsSection["ISettingsSection 接口"]
ISettingsData["ISettingsData 接口"]
IApplyAble["IApplyAbleSettings 接口"]
IEvent["ISettingsChangedEvent 接口"]
end
subgraph "实现层"
Sys["SettingsSystem 实现"]
Model["SettingsModel 实现"]
Persist["SettingsPersistence 实现"]
Audio["AudioSettings 数据"]
Graphics["GraphicsSettings 数据"]
EvtChanged["SettingsChangedEvent 事件"]
EvtSaved["SettingsSavedEvent 事件"]
EvtLoaded["SettingsLoadedEvent 事件"]
EvtAllLoaded["SettingsAllLoadedEvent 事件"]
EvtApplied["SettingsAppliedEvent 事件"]
EvtApplying["SettingsApplyingEvent 事件"]
end
ISystem --> Sys
IModel --> Model
IContextUtility --> Persist
ISettingsSection --> ISettingsData
ISettingsSection --> IApplyAble
ISettingsData --> Audio
ISettingsData --> Graphics
IEvent --> EvtChanged
IEvent --> EvtSaved
IEvent --> EvtLoaded
IEvent --> EvtAllLoaded
IEvent --> EvtApplied
IEvent --> EvtApplying
Sys --> Model
Persist --> Model
```
图表来源
- [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs#L1-L32)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [ISettingsModel.cs](file://GFramework.Game.Abstractions/setting/ISettingsModel.cs#L1-L47)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L1-L43)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12)
- [ISettingsSection.cs](file://GFramework.Game.Abstractions/setting/ISettingsSection.cs#L1-L7)
- [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14)
- [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32)
- [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32)
- [ISettingsChangedEvent.cs](file://GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs#L1-L25)
- [SettingsChangedEvent.cs](file://GFramework.Game/setting/events/SettingsChangedEvent.cs#L1-L32)
- [SettingsSavedEvent.cs](file://GFramework.Game/setting/events/SettingsSavedEvent.cs#L1-L31)
- [SettingsLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsLoadedEvent.cs#L1-L31)
- [SettingsAllLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsAllLoadedEvent.cs#L1-L30)
- [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs#L1-L41)
- [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs#L1-L31)
章节来源
- [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs#L1-L32)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [ISettingsModel.cs](file://GFramework.Game.Abstractions/setting/ISettingsModel.cs#L1-L47)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L1-L43)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12)
- [ISettingsSection.cs](file://GFramework.Game.Abstractions/setting/ISettingsSection.cs#L1-L7)
- [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14)
- [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32)
- [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32)
- [ISettingsChangedEvent.cs](file://GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs#L1-L25)
- [SettingsChangedEvent.cs](file://GFramework.Game/setting/events/SettingsChangedEvent.cs#L1-L32)
- [SettingsSavedEvent.cs](file://GFramework.Game/setting/events/SettingsSavedEvent.cs#L1-L31)
- [SettingsLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsLoadedEvent.cs#L1-L31)
- [SettingsAllLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsAllLoadedEvent.cs#L1-L30)
- [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs#L1-L41)
- [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs#L1-L31)
## 核心组件
- ISettingsSystem:提供应用设置的统一入口,支持按类型或批量应用。
- ISettingsModel:集中管理设置数据与可应用设置,提供获取、注册、遍历能力。
- ISettingsPersistence:封装异步持久化操作,屏蔽存储细节。
- ISettingsData/ISettingsSection/IApplyAbleSettings:定义设置的数据契约与可应用行为。
- 具体设置类型:AudioSettings、GraphicsSettings 提供常用配置项与默认值。
章节来源
- [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs#L1-L32)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [ISettingsModel.cs](file://GFramework.Game.Abstractions/setting/ISettingsModel.cs#L1-L47)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L1-L43)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12)
- [ISettingsSection.cs](file://GFramework.Game.Abstractions/setting/ISettingsSection.cs#L1-L7)
- [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14)
- [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32)
- [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32)
## 架构总览
设置系统采用“接口隔离 + 分层实现”的设计,通过事件总线解耦各模块,支持异步持久化与批量应用。
```mermaid
classDiagram
class ISettingsSystem {
+ApplyAll() Task
+Apply(Type) Task
+Apply~T~() Task
+Apply(IEnumerable~Type~) Task
}
class SettingsSystem {
-ISettingsModel _model
+ApplyAll() Task
+Apply(Type) Task
+Apply~T~() Task
+Apply(IEnumerable~Type~) Task
-TryApply(ISettingsSection) void
}
class ISettingsModel {
+GetData~T~() T
+TryGet(Type, out ISettingsSection) bool
+RegisterApplicator~T~(T) ISettingsModel
+GetApplicator~T~() T?
+All() IEnumerable~ISettingsSection~
}
class SettingsModel {
-Dictionary~Type, IApplyAbleSettings~ _applicators
-Dictionary~Type, ISettingsData~ _dataSettings
+GetData~T~() T
+RegisterApplicator~T~(T) ISettingsModel
+GetApplicator~T~() T?
+TryGet(Type, out ISettingsSection) bool
+All() IEnumerable~ISettingsSection~
}
class ISettingsPersistence {
+LoadAsync~T~() Task~T~
+SaveAsync~T~(T) Task
+ExistsAsync~T~() Task~bool~
+DeleteAsync~T~() Task
+SaveAllAsync(IEnumerable~ISettingsData~) Task
+LoadAllAsync(IEnumerable~Type~) Task~IDictionary~Type, ISettingsData~~
}
class SettingsPersistence {
-IStorage _storage
+LoadAsync~T~() Task~T~
+SaveAsync~T~(T) Task
+ExistsAsync~T~() Task~bool~
+DeleteAsync~T~() Task
+SaveAllAsync(IEnumerable~ISettingsData~) Task
+LoadAllAsync(IEnumerable~Type~) Task~IDictionary~Type, ISettingsData~~
}
class ISettingsData {
+Reset() void
}
class ISettingsSection
class IApplyAbleSettings {
+Apply() Task
}
class AudioSettings
class GraphicsSettings
ISettingsSystem <|.. SettingsSystem
ISettingsModel <|.. SettingsModel
ISettingsPersistence <|.. SettingsPersistence
ISettingsSection <|-- ISettingsData
ISettingsSection <|-- IApplyAbleSettings
ISettingsData <|-- AudioSettings
ISettingsData <|-- GraphicsSettings
SettingsSystem --> ISettingsModel
SettingsPersistence --> ISettingsModel
```
图表来源
- [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs#L1-L32)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [ISettingsModel.cs](file://GFramework.Game.Abstractions/setting/ISettingsModel.cs#L1-L47)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L1-L43)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12)
- [ISettingsSection.cs](file://GFramework.Game.Abstractions/setting/ISettingsSection.cs#L1-L7)
- [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14)
- [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32)
- [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32)
## 详细组件分析
### ISettingsSystem:设置应用接口
- ApplyAll:遍历模型中所有设置节,尝试应用可应用设置,并发出应用开始/完成事件。
- Apply(Type)/Apply():按单个类型应用;若未注册则直接返回。
- Apply(IEnumerable):去重后批量应用,提升效率。
- 内部机制:通过模型查询设置节,若实现 IApplyAbleSettings 则调用 Apply 并发送事件;异常时发送失败事件并抛出。
章节来源
- [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs#L1-L32)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
### SettingsSystem:设置应用实现
- 依赖注入:OnInit 中获取 ISettingsModel。
- 事件驱动:在应用前发送 SettingsApplyingEvent,成功发送 SettingsAppliedEvent(true),失败发送 SettingsAppliedEvent(false, ex)。
- 错误处理:捕获异常并重新抛出,保证上层可观测性。
章节来源
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
### ISettingsModel:设置模型接口
- GetData():自动创建并缓存 ISettingsData 实例,支持 Reset 默认值。
- TryGet:优先从数据设置字典查找,再从可应用设置字典查找。
- RegisterApplicator/GetApplicator:显式注册可应用设置,便于系统应用阶段统一处理。
- All:合并数据设置与可应用设置,提供遍历能力。
章节来源
- [ISettingsModel.cs](file://GFramework.Game.Abstractions/setting/ISettingsModel.cs#L1-L47)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
### SettingsModel:设置模型实现
- 字典缓存:分别维护 ISettingsData 与 IApplyAbleSettings 的映射,避免重复实例化。
- TryGet 查找顺序:先数据设置,后可应用设置,确保语义正确。
- All 合并:将两类设置统一暴露为 ISettingsSection 集合。
章节来源
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
### ISettingsPersistence:设置持久化接口
- LoadAsync():若存储存在则读取并发送 SettingsLoadedEvent,否则创建新实例并发送事件。
- SaveAsync():写入存储并发送 SettingsSavedEvent。
- ExistsAsync():检查键是否存在。
- DeleteAsync():删除键并发送 SettingsDeletedEvent。
- SaveAllAsync:批量写入所有 ISettingsData。
- LoadAllAsync:按已知类型集合批量读取,聚合为字典并发送 SettingsAllLoadedEvent。
章节来源
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L1-L43)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
### SettingsPersistence:设置持久化实现
- 存储键命名:统一使用 "Settings_{TypeName}"。
- 反射辅助:LoadAllAsync 中通过反射调用 IStorage.ReadAsync,保证类型安全。
- 事件发布:在每次读写/删除/批量操作后及时发出相应事件。
章节来源
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
### ISettingsData 与 ISettingsSection
- ISettingsSection:设置节的最小契约,不携带行为。
- ISettingsData:继承 ISettingsSection,提供 Reset() 以恢复默认值。
- IApplyAbleSettings:继承 ISettingsSection,提供 Apply() 异步应用到系统。
章节来源
- [ISettingsSection.cs](file://GFramework.Game.Abstractions/setting/ISettingsSection.cs#L1-L7)
- [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12)
- [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14)
### 具体设置类型:AudioSettings 与 GraphicsSettings
- AudioSettings:主音量、背景音乐音量、音效音量,默认值合理化,Reset 恢复默认。
- GraphicsSettings:全屏、分辨率宽高,默认值合理化,Reset 恢复默认。
- 均实现 ISettingsData,可被持久化与重置。
章节来源
- [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32)
- [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32)
### 设置事件系统
- ISettingsChangedEvent:事件基接口,包含 SettingsType、Settings、ChangedAt。
- SettingsChangedEvent:通用设置变更事件,携带类型化设置与时间戳。
- SettingsSavedEvent:保存完成事件。
- SettingsLoadedEvent:加载完成事件(含首次创建)。
- SettingsAllLoadedEvent:批量加载完成事件。
- SettingsAppliedEvent:应用完成事件,包含成功标志与异常。
- SettingsApplyingEvent:应用开始事件。
事件触发时机与使用建议:
- 加载:LoadAsync() 成功读取或新建时分别触发 SettingsLoadedEvent。
- 保存:SaveAsync() 成功写入后触发 SettingsSavedEvent。
- 删除:DeleteAsync() 成功删除后触发 SettingsDeletedEvent。
- 批量:SaveAllAsync/LloadAllAsync 分别触发 SettingsBatchSavedEvent 与 SettingsAllLoadedEvent。
- 应用:SettingsSystem 在 TryApply 前后分别触发 SettingsApplyingEvent 与 SettingsAppliedEvent。
章节来源
- [ISettingsChangedEvent.cs](file://GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs#L1-L25)
- [SettingsChangedEvent.cs](file://GFramework.Game/setting/events/SettingsChangedEvent.cs#L1-L32)
- [SettingsSavedEvent.cs](file://GFramework.Game/setting/events/SettingsSavedEvent.cs#L1-L31)
- [SettingsLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsLoadedEvent.cs#L1-L31)
- [SettingsAllLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsAllLoadedEvent.cs#L1-L30)
- [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs#L1-L41)
- [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs#L1-L31)
## 依赖关系分析
- SettingsSystem 依赖 ISettingsModel;SettingsPersistence 依赖 ISettingsModel 与 IStorage。
- SettingsModel 维护两类设置的内部字典,对外统一暴露 ISettingsSection。
- 事件系统通过 ISettingsChangedEvent 作为多态基类,实现松耦合。
```mermaid
graph LR
Sys["SettingsSystem"] --> Model["ISettingsModel/SettingsModel"]
Persist["SettingsPersistence"] --> Model
Persist --> Storage["IStorage"]
Model --> Data["ISettingsData"]
Model --> App["IApplyAbleSettings"]
Events["ISettingsChangedEvent"] --> E1["SettingsChangedEvent"]
Events --> E2["SettingsSavedEvent"]
Events --> E3["SettingsLoadedEvent"]
Events --> E4["SettingsAllLoadedEvent"]
Events --> E5["SettingsAppliedEvent"]
Events --> E6["SettingsApplyingEvent"]
```
图表来源
- [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)
- [ISettingsChangedEvent.cs](file://GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs#L1-L25)
- [SettingsChangedEvent.cs](file://GFramework.Game/setting/events/SettingsChangedEvent.cs#L1-L32)
- [SettingsSavedEvent.cs](file://GFramework.Game/setting/events/SettingsSavedEvent.cs#L1-L31)
- [SettingsLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsLoadedEvent.cs#L1-L31)
- [SettingsAllLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsAllLoadedEvent.cs#L1-L30)
- [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs#L1-L41)
- [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs#L1-L31)
## 性能考虑
- 批量应用:SettingsSystem.Apply(IEnumerable) 对类型进行去重,减少重复查找与应用开销。
- 缓存策略:SettingsModel 对 ISettingsData 与 IApplyAbleSettings 进行字典缓存,避免重复实例化。
- 异步 I/O:SettingsPersistence 使用异步读写,避免阻塞主线程;LoadAllAsync 通过反射调用泛型方法,注意仅在启动或加载阶段使用。
- 事件风暴:大量设置同时保存/加载时,建议聚合事件或限流,避免 UI 或日志系统过载。
## 故障排查指南
- 应用失败:检查 SettingsAppliedEvent 是否携带异常;确认 IApplyAbleSettings.Apply 实现幂等与异常处理。
- 未生效:确认设置类型已在 SettingsModel 中注册(RegisterApplicator),或通过 GetData 自动创建的数据是否被系统应用。
- 持久化异常:核对存储键命名规则(Settings_{TypeName})与序列化兼容性;检查 IStorage 实现。
- 事件未触发:确认事件总线可用,且系统在关键路径(加载/保存/应用)中调用了 SendEvent。
章节来源
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
## 结论
GFramework.Settings 通过清晰的接口分层与事件驱动,提供了可扩展、可测试、可持久化的设置管理方案。开发者可通过 ISettingsData 快速声明配置项,通过 IApplyAbleSettings 将配置应用到系统,借助 ISettingsPersistence 实现跨会话的持久化,并通过事件系统实现可观测与解耦。
## 附录:完整 API 参考
### ISettingsSystem
- ApplyAll() → Task:应用所有可应用设置。
- Apply(Type) → Task:按类型应用设置。
- Apply() → Task:泛型版本按类型应用。
- Apply(IEnumerable) → Task:批量应用多个类型。
章节来源
- [ISettingsSystem.cs](file://GFramework.Game.Abstractions/setting/ISettingsSystem.cs#L1-L32)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
### ISettingsModel
- GetData() → T:获取或创建 ISettingsData 实例。
- TryGet(Type, out ISettingsSection) → bool:按类型查找设置节。
- RegisterApplicator(T) → ISettingsModel:注册可应用设置。
- GetApplicator() → T?:获取已注册可应用设置。
- All() → IEnumerable:获取全部设置节。
章节来源
- [ISettingsModel.cs](file://GFramework.Game.Abstractions/setting/ISettingsModel.cs#L1-L47)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
### ISettingsPersistence
- LoadAsync() → Task:异步加载指定类型设置。
- SaveAsync(T) → Task:异步保存设置。
- ExistsAsync() → Task:检查设置是否存在。
- DeleteAsync() → Task:异步删除设置。
- SaveAllAsync(IEnumerable) → Task:批量保存。
- LoadAllAsync(IEnumerable) → Task>:批量加载。
章节来源
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L1-L43)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
### ISettingsData 与 ISettingsSection
- ISettingsSection:设置节契约。
- ISettingsData:继承 ISettingsSection,提供 Reset()。
章节来源
- [ISettingsSection.cs](file://GFramework.Game.Abstractions/setting/ISettingsSection.cs#L1-L7)
- [ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12)
### IApplyAbleSettings
- Apply() → Task:将设置应用到系统。
章节来源
- [IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14)
### 具体设置类型
- AudioSettings:主音量、BGM 音量、SFX 音量,默认值与 Reset。
- GraphicsSettings:全屏、分辨率宽高,默认值与 Reset。
章节来源
- [AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32)
- [GraphicsSettings.cs](file://GFramework.Game.Abstractions/setting/GraphicsSettings.cs#L1-L32)
### 设置事件
- ISettingsChangedEvent:SettingsType、Settings、ChangedAt。
- SettingsChangedEvent:通用变更事件。
- SettingsSavedEvent:保存完成事件。
- SettingsLoadedEvent:加载完成事件。
- SettingsAllLoadedEvent:批量加载完成事件。
- SettingsAppliedEvent:应用完成事件(含成功/失败与异常)。
- SettingsApplyingEvent:应用开始事件。
章节来源
- [ISettingsChangedEvent.cs](file://GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs#L1-L25)
- [SettingsChangedEvent.cs](file://GFramework.Game/setting/events/SettingsChangedEvent.cs#L1-L32)
- [SettingsSavedEvent.cs](file://GFramework.Game/setting/events/SettingsSavedEvent.cs#L1-L31)
- [SettingsLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsLoadedEvent.cs#L1-L31)
- [SettingsAllLoadedEvent.cs](file://GFramework.Game/setting/events/SettingsAllLoadedEvent.cs#L1-L30)
- [SettingsAppliedEvent.cs](file://GFramework.Game/setting/events/SettingsAppliedEvent.cs#L1-L41)
- [SettingsApplyingEvent.cs](file://GFramework.Game/setting/events/SettingsApplyingEvent.cs#L1-L31)
### 常见场景示例(步骤说明)
- 创建自定义设置
- 定义一个实现 ISettingsData 的类,提供字段与 Reset()。
- 在系统初始化时通过 SettingsModel.GetData() 获取实例,或在需要时注册为可应用设置。
- 参考路径:[ISettingsData.cs](file://GFramework.Game.Abstractions/setting/ISettingsData.cs#L1-L12),[SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- 实现设置验证
- 在设置赋值处添加范围校验(如音量 0~1),并在失败时记录日志或回滚。
- 参考路径:[AudioSettings.cs](file://GFramework.Game.Abstractions/setting/AudioSettings.cs#L1-L32)
- 处理设置同步
- 使用 SettingsPersistence.SaveAsync() 保存,监听 SettingsSavedEvent 确认完成。
- 参考路径:[ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L1-L43),[SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141),[SettingsSavedEvent.cs](file://GFramework.Game/setting/events/SettingsSavedEvent.cs#L1-L31)
- 应用设置到系统
- 将设置实现 IApplyAbleSettings 并在 SettingsSystem.Apply* 调用时自动应用。
- 参考路径:[IApplyAbleSettings.cs](file://GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs#L1-L14),[SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)