using GFramework.Core.extensions; using GFramework.Core.system; using GFramework.Game.Abstractions.setting; using GFramework.Game.setting.events; namespace GFramework.Game.setting; /// /// 设置系统,负责管理和应用各种设置配置 /// public class SettingsSystem : AbstractSystem, ISettingsSystem { private ISettingsModel _model = null!; /// /// 应用所有设置配置 /// /// 完成的任务 public Task ApplyAll() { // 遍历所有设置配置并尝试应用 foreach (var section in _model.All()) { TryApply(section); } return Task.CompletedTask; } /// /// 应用指定类型的设置配置 /// /// 设置配置类型,必须是类且实现ISettingsSection接口 /// 完成的任务 public Task Apply() where T : class, ISettingsSection => Apply(typeof(T)); /// /// 应用指定类型的设置配置 /// /// 设置配置类型 /// 完成的任务 public Task Apply(Type settingsType) { if (!_model.TryGet(settingsType, out var section)) return Task.CompletedTask; TryApply(section); return Task.CompletedTask; } /// /// 应用指定类型集合的设置配置 /// /// 设置配置类型集合 /// 完成的任务 public Task Apply(IEnumerable settingsTypes) { // 去重后遍历设置类型,获取并应用对应的设置配置 foreach (var type in settingsTypes.Distinct()) { if (_model.TryGet(type, out var section)) { TryApply(section); } } return Task.CompletedTask; } /// /// 初始化设置系统,获取设置模型实例 /// protected override void OnInit() { _model = this.GetModel()!; } /// /// 尝试应用可应用的设置配置 /// /// 设置配置对象 private void TryApply(ISettingsSection section) { if (section is not IApplyAbleSettings applyAbleSettings) return; this.SendEvent(new SettingsApplyingEvent(section)); try { applyAbleSettings.Apply(); this.SendEvent(new SettingsAppliedEvent(section, true)); } catch (Exception ex) { this.SendEvent(new SettingsAppliedEvent(section, false, ex)); throw; } } }