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