using System.Collections.Generic; using System.Globalization; using AibisDream.Framework; using AibisDream.Kit; using UnityEngine; using System.IO; using AibisDream.Utility; namespace AibisDream { /// /// 用于规定配置如何影响游戏内容 /// public class SettingLoader { private readonly ConfigContainer _container; private SettingLoader() { // Enter Play Mode 关闭 Domain Reload 时静态状态可能保留,加载配置前先恢复默认值。 TextSpeedSettings.Reset(); // 初始化设置文件(如果不存在) InitSettingFile(); // 读取数据 _container = new ConfigContainer(ConstRef.SettingPath); LoadAllSetting(); // 注册回调函数 _container.OnWrite += OnSettingChanged; } private void Dispose() { _container.OnWrite -= OnSettingChanged; } private void InitSettingFile() { // 如果文件存在,则直接返回 if (File.Exists(ConstRef.SettingPath)) { return; } // 如果文件不存在,则复制默认设置(Language 为空表示跟随系统语言) var defaultSetting = JsonUtil.ReadJObject(ConstRef.SettingDefaultPath); JsonUtil.SaveJObject(defaultSetting, ConstRef.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": TextSpeedSettings.ApplyStoredValue(value); EnumEventSystem.Global.Send( SettingChangeEvent.TextSpeed, TextSpeedSettings.CurrentCanonicalValue); 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; 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 } }