134 lines
4.4 KiB
C#
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
|
|
}
|
|
}
|