/* * @Author: 白哉 * @Description: * @Date: 2025年07月24日 星期四 11:07:37 * @Modify: */ using System; using System.IO; using System.Linq; using ExcelConfig; using Logic.Config; using Logic.CrashSight; using Logic.Multilingual; using UnityEngine; namespace TH1_Logic.Config { public class ConfigManager { public static ConfigManager Instance = new ConfigManager(); public GameConfig Config; public VersionConfig VersionCfg; private static ColorConfig _colorConfig; public static ColorConfig ColorConfig { get { if (_colorConfig == null) { _colorConfig = Resources.Load("TH1Config/ColorConfig"); } return _colorConfig; } } 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(json); } Config ??= new GameConfig(); } if (!VersionCfg) { VersionCfg = Resources.Load("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($"ExcelConfig/GenerateBytes/{configName}"); return asset?.bytes ?? Array.Empty(); } 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; } } }