using System; using System.Collections.Generic; using Fantasy.Serialize; #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. // ReSharper disable SuspiciousTypeConversion.Global namespace Fantasy.ConfigTable { /// /// 配置表帮助类 /// public static class ConfigTableHelper { private static string _assetBundleDirectoryPath; private static IConfigTableAssetBundle _configTableAssetBundle; private static readonly object Lock = new object(); // 配置表数据缓存字典 private static readonly Dictionary ConfigDic = new (); /// /// 初始化ConfigTableHelper /// /// /// public static void Initialize(string assetBundleDirectoryPath, IConfigTableAssetBundle configTableAssetBundle) { _assetBundleDirectoryPath = assetBundleDirectoryPath; _configTableAssetBundle = configTableAssetBundle; } /// /// 加载配置表数据 /// /// 配置表类型 /// 配置表数据 public static T Load() where T : ASerialize { lock (Lock) { try { var dataConfig = typeof(T).Name; if (ConfigDic.TryGetValue(dataConfig, out var aProto)) { return (T)aProto; } var dataConfigPath = _configTableAssetBundle.Combine(_assetBundleDirectoryPath, dataConfig); var bytes = _configTableAssetBundle.LoadConfigTable(dataConfigPath); var data = SerializerManager.GetSerializer(FantasySerializerType.ProtoBuf).Deserialize(bytes); ConfigDic[dataConfig] = data; return data; } catch (Exception ex) { throw new Exception($"ConfigTableManage:{typeof(T).Name} 数据表加载之后反序列化时出错:{ex}"); } } } /// /// 重新加载配置表数据 /// public static void ReLoadConfigTable() { lock (Lock) { foreach (var (_, aProto) in ConfigDic) { ((IDisposable) aProto).Dispose(); } ConfigDic.Clear(); } } } }