Files
aibis-dream/Assets/Scripts/Game Loop/SettingLoader.cs
T

134 lines
4.4 KiB
C#

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
{
/// <summary>
/// 用于规定配置如何影响游戏内容
/// </summary>
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()
{
// Enter Play Mode 关闭 Domain Reload 时静态状态可能保留,加载配置前先恢复默认值。
TextSpeedSettings.Reset();
// 初始化设置文件(如果不存在)
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":
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;
case "OpenTimer":
var isTimerOpen = bool.TryParse(value, out var result) ? result : false;
UIManager.Instance.GetPanel<InfoPanel>().SetTimerActive(isTimerOpen);
break;
case "EndTime":
int endTime = int.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out var endTime1) ? endTime1 : 1200;
UIManager.Instance.GetPanel<InfoPanel>().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<string, string> 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
}
}