diff --git a/GFramework.Game.Abstractions/setting/ISettingsSystem.cs b/GFramework.Game.Abstractions/setting/ISettingsSystem.cs
index 34ed148..6faf516 100644
--- a/GFramework.Game.Abstractions/setting/ISettingsSystem.cs
+++ b/GFramework.Game.Abstractions/setting/ISettingsSystem.cs
@@ -10,10 +10,19 @@ public interface ISettingsSystem : ISystem
///
/// 应用所有可应用的设置
///
+ /// 表示异步操作的任务
Task ApplyAll();
///
/// 应用指定类型的设置(泛型版本)
///
+ /// 设置类型,必须是class且实现IApplyAbleSettings接口
+ /// 表示异步操作的任务
Task Apply() where T : class, IApplyAbleSettings;
+
+ ///
+ /// 保存所有设置
+ ///
+ /// 表示异步操作的任务
+ Task SaveAll();
}
\ No newline at end of file
diff --git a/GFramework.Game/setting/SettingsSystem.cs b/GFramework.Game/setting/SettingsSystem.cs
index 37ebe28..291e9d9 100644
--- a/GFramework.Game/setting/SettingsSystem.cs
+++ b/GFramework.Game/setting/SettingsSystem.cs
@@ -1,5 +1,6 @@
using GFramework.Core.extensions;
using GFramework.Core.system;
+using GFramework.Game.Abstractions.data;
using GFramework.Game.Abstractions.setting;
using GFramework.Game.setting.events;
@@ -8,9 +9,12 @@ namespace GFramework.Game.setting;
///
/// 设置系统,负责管理和应用各种设置配置
///
-public class SettingsSystem : AbstractSystem, ISettingsSystem
+public class SettingsSystem(IDataRepository? repository)
+ : AbstractSystem, ISettingsSystem where TRepository : class, IDataRepository
{
private ISettingsModel _model = null!;
+ private IDataRepository? _repository = repository;
+ private IDataRepository Repository => _repository ?? throw new InvalidOperationException("Repository is not set");
///
/// 应用所有设置配置
@@ -18,6 +22,7 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
/// 完成的任务
public async Task ApplyAll()
{
+ // 遍历所有设置应用器并尝试应用
foreach (var applicator in _model.AllApplicators())
{
await TryApplyAsync(applicator);
@@ -37,6 +42,22 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
: Task.CompletedTask;
}
+ ///
+ /// 保存所有设置数据到存储库
+ ///
+ /// 完成的任务
+ public async Task SaveAll()
+ {
+ // 遍历所有设置数据并保存可持久化的数据
+ foreach (var data in _model.AllData())
+ {
+ if (data is IData persistable)
+ {
+ await Repository.SaveAsync(persistable);
+ }
+ }
+ }
+
///
/// 初始化设置系统,获取设置模型实例
@@ -44,6 +65,7 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
protected override void OnInit()
{
_model = this.GetModel()!;
+ _repository ??= this.GetUtility()!;
}
///
@@ -54,15 +76,18 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
{
if (section is not IApplyAbleSettings applyAbleSettings) return;
+ // 发送设置应用中事件
this.SendEvent(new SettingsApplyingEvent(section));
try
{
await applyAbleSettings.Apply();
+ // 发送设置应用成功事件
this.SendEvent(new SettingsAppliedEvent(section, true));
}
catch (Exception ex)
{
+ // 发送设置应用失败事件
this.SendEvent(new SettingsAppliedEvent(section, false, ex));
}
}