TH1/Unity/Assets/Scripts/TH1_Logic/Config/ConfigManager.cs
2025-11-24 14:18:47 +08:00

158 lines
4.4 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年07月24日 星期四 11:07:37
* @Modify:
*/
using System;
using System.IO;
using System.Linq;
using ExcelConfig;
using Logic.CrashSight;
using Logic.Multilingual;
using UnityEngine;
namespace Logic.Config
{
public class ConfigManager
{
public static ConfigManager Instance = new ConfigManager();
public GameConfig Config;
public VersionConfig VersionCfg;
public void Init()
{
if (Config == null)
{
string path = Application.persistentDataPath + "/game_cfg.json";
if (File.Exists(path))
{
string json = File.ReadAllText(path);
Config = JsonUtility.FromJson<GameConfig>(json);
}
Config ??= new GameConfig();
}
if (!VersionCfg)
{
VersionCfg = Resources.Load<VersionConfig>("Export/VersionConfig");
}
CrashSightAgent.SetAppVersion(VersionCfg.CurVersionInfo.FullVersion);
}
public void InitExcelConfig()
{
// 获取当前程序集中所有实现 IExcelConfig 接口的类
var excelConfigTypes = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
.Where(t => typeof(ExcelConfigBase).IsAssignableFrom(t)
&& t.IsClass
&& !t.IsAbstract);
foreach (var type in excelConfigTypes)
{
try
{
// 创建实例
var instance = (ExcelConfigBase)Activator.CreateInstance(type);
// 这里可以根据需要加载对应的配置数据
// 例如:从 Resources 或其他路径加载 byte[] 数据
byte[] configData = LoadConfigData(type.Name);
// 调用 Init 方法
instance.Init(configData);
}
catch (Exception ex)
{
LogSystem.LogError($"初始化配置失败: {type.Name}, 错误: {ex.Message}");
}
}
}
private byte[] LoadConfigData(string typeName)
{
string configName = typeName.Replace("Category", "");
TextAsset asset = Resources.Load<TextAsset>($"ExcelConfig/GenerateBytes/{configName}");
return asset?.bytes ?? Array.Empty<byte>();
}
public void Update()
{
if (Config == null || !Config.IsChanged) return;
string json = JsonUtility.ToJson(Config);
File.WriteAllText(Application.persistentDataPath + "/game_cfg.json", json);
}
}
[Serializable]
public class GameConfig
{
[SerializeField]
private MultilingualType _multilingualType;
[SerializeField]
private float _musicVolume;
[SerializeField]
private float _audioVolume;
[SerializeField]
private bool _showReminder;
private bool _isChanged;
public bool IsChanged => _isChanged;
public MultilingualType MultilingualType
{
get => _multilingualType;
set
{
if (_multilingualType == value) return;
_isChanged = true;
_multilingualType = value;
}
}
public float MusicVolume
{
get => _musicVolume;
set
{
if (Math.Abs(_musicVolume - value) < 0.01f) return;
_isChanged = true;
_musicVolume = value;
}
}
public float AudioVolume
{
get => _audioVolume;
set
{
if (Math.Abs(_audioVolume - value) < 0.01f) return;
_isChanged = true;
_audioVolume = value;
}
}
public bool ShowReminder
{
get => _showReminder;
set
{
if (_showReminder == value) return;
_isChanged = true;
_showReminder = value;
}
}
public GameConfig()
{
_multilingualType = MultilingualType.None;
_musicVolume = 0.5f;
_audioVolume = 0.5f;
_showReminder = true;
}
}
}