diff --git a/GFramework.Game.Abstractions/setting/ISettingsModel.cs b/GFramework.Game.Abstractions/setting/ISettingsModel.cs index 4821175..6131bbe 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsModel.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsModel.cs @@ -63,4 +63,15 @@ public interface ISettingsModel : IModel /// 要初始化的设置类型数组 /// 异步操作任务 Task InitializeAsync(params Type[] settingTypes); + + /// + /// 重置指定类型的设置 + /// + /// 要重置的设置类型,必须实现IResettable接口并具有无参构造函数 + void Reset() where T : class, IResettable, new(); + + /// + /// 重置所有设置 + /// + void ResetAll(); } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/setting/ISettingsSystem.cs b/GFramework.Game.Abstractions/setting/ISettingsSystem.cs index 6faf516..534e66d 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsSystem.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsSystem.cs @@ -25,4 +25,17 @@ public interface ISettingsSystem : ISystem /// /// 表示异步操作的任务 Task SaveAll(); + + /// + /// 重置指定类型的设置 + /// + /// 设置类型,必须继承自class并实现IPersistentApplyAbleSettings接口 + /// 表示异步操作的任务 + Task Reset() where T : class, IPersistentApplyAbleSettings, new(); + + /// + /// 重置所有设置 + /// + /// 表示异步操作的任务 + Task ResetAll(); } \ No newline at end of file diff --git a/GFramework.Game/setting/SettingsModel.cs b/GFramework.Game/setting/SettingsModel.cs index 86bd2e4..ab91655 100644 --- a/GFramework.Game/setting/SettingsModel.cs +++ b/GFramework.Game/setting/SettingsModel.cs @@ -125,6 +125,58 @@ public class SettingsModel(IDataRepository? repository) return this; } + + // ----------------------------- + // Load / Init + // ----------------------------- + + /// + /// 异步初始化设置模型,加载指定类型的设置数据 + /// + /// 要初始化的设置类型数组 + public async Task InitializeAsync(params Type[] settingTypes) + { + foreach (var type in settingTypes) + { + if (!typeof(IResettable).IsAssignableFrom(type) || + !typeof(IData).IsAssignableFrom(type)) + continue; + + try + { + var loaded = (ISettingsSection)await Repository.LoadAsync(type); + var migrated = MigrateIfNeeded(loaded); + _dataSettings[type] = (IResettable)migrated; + _migrationCache.TryRemove(type, out _); + } + catch (Exception ex) + { + Log.Error($"Failed to load settings for {type.Name}", ex); + } + } + } + + /// + /// 重置指定类型的可重置对象 + /// + /// 要重置的对象类型,必须是class类型,实现IResettable接口,并具有无参构造函数 + public void Reset() where T : class, IResettable, new() + { + var data = GetData(); + data.Reset(); + } + + /// + /// 重置所有存储的数据设置对象 + /// + public void ResetAll() + { + foreach (var data in _dataSettings.Values) + { + data.Reset(); + } + } + /// /// 如果需要的话,对设置节进行版本迁移 /// @@ -157,37 +209,6 @@ public class SettingsModel(IDataRepository? repository) } - // ----------------------------- - // Load / Init - // ----------------------------- - - /// - /// 异步初始化设置模型,加载指定类型的设置数据 - /// - /// 要初始化的设置类型数组 - public async Task InitializeAsync(params Type[] settingTypes) - { - foreach (var type in settingTypes) - { - if (!typeof(IResettable).IsAssignableFrom(type) || - !typeof(IData).IsAssignableFrom(type)) - continue; - - try - { - var loaded = (ISettingsSection)await Repository.LoadAsync(type); - var migrated = MigrateIfNeeded(loaded); - _dataSettings[type] = (IResettable)migrated; - _migrationCache.TryRemove(type, out _); - } - catch (Exception ex) - { - Log.Error($"Failed to load settings for {type.Name}", ex); - } - } - } - - /// /// 初始化方法,用于获取设置持久化服务 /// diff --git a/GFramework.Game/setting/SettingsSystem.cs b/GFramework.Game/setting/SettingsSystem.cs index 291e9d9..c71cdd8 100644 --- a/GFramework.Game/setting/SettingsSystem.cs +++ b/GFramework.Game/setting/SettingsSystem.cs @@ -58,6 +58,27 @@ public class SettingsSystem(IDataRepository? repository) } } + /// + /// 重置所有设置并应用更改 + /// + /// 异步任务 + public async Task ResetAll() + { + _model.ResetAll(); + await ApplyAll(); + } + + /// + /// 重置指定类型的设置并应用更改 + /// + /// 设置类型,必须实现IPersistentApplyAbleSettings接口且具有无参构造函数 + /// 异步任务 + public async Task Reset() where T : class, IPersistentApplyAbleSettings, new() + { + _model.Reset(); + await Apply(); + } + /// /// 初始化设置系统,获取设置模型实例 diff --git a/GFramework.Godot/setting/GodotAudioSettings.cs b/GFramework.Godot/setting/GodotAudioSettings.cs index d274094..97db2a4 100644 --- a/GFramework.Godot/setting/GodotAudioSettings.cs +++ b/GFramework.Godot/setting/GodotAudioSettings.cs @@ -8,9 +8,9 @@ namespace GFramework.Godot.setting; /// /// Godot音频设置实现类,用于应用音频配置到Godot音频系统 /// -/// 音频设置对象,包含主音量、背景音乐音量和音效音量 +/// 设置模型对象,提供音频设置数据访问 /// 音频总线映射对象,定义了不同音频类型的总线名称 -public class GodotAudioSettings(AudioSettings settings, AudioBusMap audioBusMap) +public class GodotAudioSettings(ISettingsModel model, AudioBusMap audioBusMap) : IPersistentApplyAbleSettings { /// @@ -19,16 +19,18 @@ public class GodotAudioSettings(AudioSettings settings, AudioBusMap audioBusMap) /// 表示异步操作的任务 public Task Apply() { + var settings = model.GetData(); SetBus(audioBusMap.Master, settings.MasterVolume); SetBus(audioBusMap.Bgm, settings.BgmVolume); SetBus(audioBusMap.Sfx, settings.SfxVolume); return Task.CompletedTask; } - public void Reset() - { - settings.Reset(); - } + /// + /// 重置音频设置为默认值 + /// + public void Reset() => + model.GetData().Reset(); /// /// 设置指定音频总线的音量 diff --git a/GFramework.Godot/setting/GodotGraphicsSettings.cs b/GFramework.Godot/setting/GodotGraphicsSettings.cs index 21eb457..0d0b7fc 100644 --- a/GFramework.Godot/setting/GodotGraphicsSettings.cs +++ b/GFramework.Godot/setting/GodotGraphicsSettings.cs @@ -7,8 +7,8 @@ namespace GFramework.Godot.setting; /// /// Godot图形设置应用器 /// -/// 图形设置配置对象 -public class GodotGraphicsSettings(GraphicsSettings settings) : IPersistentApplyAbleSettings +/// 设置模型接口 +public class GodotGraphicsSettings(ISettingsModel model) : IPersistentApplyAbleSettings { /// /// 应用图形设置到Godot引擎 @@ -16,6 +16,7 @@ public class GodotGraphicsSettings(GraphicsSettings settings) : IPersistentApply /// 异步任务 public async Task Apply() { + var settings = model.GetData(); // 创建分辨率向量 var size = new Vector2I(settings.ResolutionWidth, settings.ResolutionHeight); @@ -42,8 +43,8 @@ public class GodotGraphicsSettings(GraphicsSettings settings) : IPersistentApply await Task.CompletedTask; } - public void Reset() - { - settings.Reset(); - } + /// + /// 重置图形设置 + /// + public void Reset() => model.GetData().Reset(); } \ No newline at end of file diff --git a/GFramework.Godot/setting/GodotLocalizationSettings.cs b/GFramework.Godot/setting/GodotLocalizationSettings.cs index 6f2b48a..1c1f015 100644 --- a/GFramework.Godot/setting/GodotLocalizationSettings.cs +++ b/GFramework.Godot/setting/GodotLocalizationSettings.cs @@ -21,9 +21,9 @@ namespace GFramework.Godot.setting; /// /// Godot本地化设置类,负责应用本地化配置到Godot引擎 /// -/// 本地化设置对象 +/// 设置模型 /// 本地化映射表 -public class GodotLocalizationSettings(LocalizationSettings settings, LocalizationMap localizationMap) +public class GodotLocalizationSettings(ISettingsModel model, LocalizationMap localizationMap) : IPersistentApplyAbleSettings { /// @@ -32,6 +32,7 @@ public class GodotLocalizationSettings(LocalizationSettings settings, Localizati /// 完成的任务 public Task Apply() { + var settings = model.GetData(); // 尝试从映射表获取 Godot locale var locale = localizationMap.LanguageMap.GetValueOrDefault(settings.Language, "en"); // 默认值 @@ -42,5 +43,5 @@ public class GodotLocalizationSettings(LocalizationSettings settings, Localizati /// /// 重置本地化设置 /// - public void Reset() => settings.Reset(); + public void Reset() => model.GetData().Reset(); } \ No newline at end of file