using System; using System.Collections.Generic; using System.Linq; using NBF.Setting; namespace NBF { public class Settings : MonoService, ISettings { private readonly Dictionary> _dictionary = new Dictionary>(); protected override void OnAwake() { List list = new List(); var options = Reflection.GetAllNonAbstractDerivedTypes(); foreach (var option in options) { var settingOption = Activator.CreateInstance(option); if (settingOption is OptionBase optionSetting) { list.Add(optionSetting); optionSetting.Initialize(this); } } list.SortBySortAttribute(); AddRangeToTab(list); } public void LoadAllSettings() { foreach (var list in _dictionary.Values) { foreach (var option in list) { option.Load(); } } } /// /// 是否有未保存的设置 /// public bool HaveNotAppleSettings() { return _dictionary.Values.SelectMany(list => list).Any(option => option.HaveNotApple()); } #region 设置组 public T GetSettingOption() where T : OptionBase { foreach (var option in _dictionary.Values.SelectMany(options => options)) { if (option is T optionSetting) { return optionSetting; } } return null; } /// /// 获取指定 Tab 的所有 OptionBase /// public List GetOptionsByTab(string group) { if (string.IsNullOrEmpty(group)) { throw new ArgumentException("Tab name cannot be null or empty."); } return _dictionary.TryGetValue(group, out var options) ? options : new List(); } /// /// 获取所有 Tab 名字列表 /// public IEnumerable GetAllTabs() { return _dictionary.Keys; } /// /// 将 OptionBase 按 Tab 分类存入字典 /// private void AddToTab(OptionBase option) { if (option == null) return; if (string.IsNullOrEmpty(option.Tab)) return; // 如果字典中没有该 Tab,则新建一个 List 并加入字典 if (!_dictionary.ContainsKey(option.Tab)) { _dictionary[option.Tab] = new List(); } // 将 Option 添加到对应的 Tab List 中 _dictionary[option.Tab].Add(option); } /// /// 批量添加 OptionBase 到字典 /// private void AddRangeToTab(IEnumerable options) { if (options == null) return; foreach (var option in options) { AddToTab(option); } } #endregion } }