using System.Collections.Generic; using System.Globalization; using AibisDream.Framework; using AibisDream.Kit; using AibisDream.UI; using UnityEngine; using System.IO; using AibisDream.Utility; namespace AibisDream { /// /// 用于规定配置如何影响游戏内容 /// public class SettingLoader { private static readonly string SettingPath = Path.Combine(Application.persistentDataPath, "AllOurBrokenParts", "Config", "setting.json"); private static readonly string SettingDefaultPath = Path.Combine(Application.streamingAssetsPath, "Config", "setting.json"); private readonly ConfigContainer _container; private SettingLoader() { // 初始化设置文件(如果不存在) InitSettingFile(); // 读取数据 _container = new ConfigContainer(SettingPath); LoadAllSetting(); // 注册回调函数 _container.OnWrite += OnSettingChanged; } private void Dispose() { _container.OnWrite -= OnSettingChanged; } private void InitSettingFile() { // 如果文件存在,则直接返回 if (File.Exists(SettingPath)) { return; } // 如果文件不存在,则复制默认设置(Language 为空表示跟随系统语言) var defaultSetting = JsonUtil.ReadJObject(SettingDefaultPath); JsonUtil.SaveJObject(defaultSetting, SettingPath); } private void LoadAllSetting() { var settingConfig = _container.ReadAll(); foreach (var pair in settingConfig) { OnSettingChanged(pair.Key, pair.Value); } } private void OnSettingChanged(string propName, string value) { // 配置项同步 switch (propName) { case "Volume": AudioManager.Instance.SetVolume(float.Parse(value, CultureInfo.InvariantCulture)); break; case "TextSpeed": EnumEventSystem.Global.Send(SettingChangeEvent.TextSpeed, value); break; case "Resolution": // TODO 调整分辨率 break; case "WindowMode": // 屏幕模式 #if !UNITY_ANDROID && !UNITY_IOS DisplaySettingsController.Instance.ApplyWindowMode(value); #endif break; case "Language": LocalizationKit.SwitchLanguage(LocalizationKit.ResolveLanguage(value)); break; case "OpenTimer": var isTimerOpen = bool.TryParse(value, out var result) ? result : false; UIManager.Instance.GetPanel().SetTimerActive(isTimerOpen); break; case "EndTime": int endTime = int.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out var endTime1) ? endTime1 : 1200; UIManager.Instance.GetPanel().SetTimerDuration(endTime); break; default: Debug.Log($"{propName}未正确处理"); break; } } public void Write(string propName, string value) { _container.Write(propName, value); } public bool TryRead(string key, out string value) { return _container.TryRead(key, out value); } public Dictionary ReadAll() { return _container.ReadAll(); } #region 单例部分 public static SettingLoader Instance { get; private set; } public static void Init() { if (Instance != null) { Instance.Dispose(); Instance = null; } Instance = new SettingLoader(); } #endregion } }