ConfigComponent.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Threading;
  6. using Excel2Json;
  7. using Fort23.Core;
  8. using Fort23.GameData;
  9. using Utility;
  10. #if !COMBAT_SERVER
  11. using UnityEditor;
  12. using UnityEngine;
  13. #endif
  14. namespace Fort23.UTool
  15. {
  16. /// <summary>
  17. /// 配置表组件
  18. /// </summary>
  19. public class ConfigComponent : Singleton<ConfigComponent>
  20. {
  21. private MultiSheetInfoGroup multiSheetInfoGroup;
  22. private Dictionary<Type, ConfigHolder> _allConfigHolders = new Dictionary<Type, ConfigHolder>();
  23. #if COMBAT_SERVER
  24. private bool init;
  25. public void SetConfig(Dictionary<Type, ConfigHolder> allConfigHolders)
  26. {
  27. if (init)
  28. {
  29. return;
  30. }
  31. init = true;
  32. _allConfigHolders.Clear();
  33. _allConfigHolders = allConfigHolders;
  34. }
  35. public override void Dispose()
  36. {
  37. _allConfigHolders.Clear();
  38. base.Dispose();
  39. }
  40. #endif
  41. #if !COMBAT_SERVER
  42. #if UNITY_EDITOR
  43. /// <summary>
  44. /// 预先加载所有配置文件
  45. /// </summary>
  46. /// <param name="isLogin">登录的时候只加载指定列表里面的数据,这样可以减少加载时间</param>
  47. public void EditorPreload(bool isLogin = false)
  48. {
  49. _allConfigHolders.Clear();
  50. ConfigHolder configHolder = null;
  51. Assembly gameDataAssembly = EventSystem.Instance.GetAssembly("Fort23.GameData.dll");
  52. if (gameDataAssembly == null)
  53. {
  54. LogTool.Error("Fort23.GameData资源加载失败");
  55. return;
  56. }
  57. CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
  58. foreach (Type type in gameDataAssembly.GetTypes())
  59. {
  60. object[] attrs = type.GetCustomAttributes(typeof(ConfigAttribute), false);
  61. if (attrs.Length == 0)
  62. {
  63. continue;
  64. }
  65. try
  66. {
  67. ConfigAttribute configAttribute =
  68. type.GetCustomAttribute(typeof(ConfigAttribute)) as ConfigAttribute;
  69. if (configAttribute != null)
  70. {
  71. TextAsset ta =
  72. AssetDatabase.LoadAssetAtPath<TextAsset>(@"Assets\Res\Config\" + configAttribute.prefab);
  73. configHolder = JsonHelper.FromJson(ta.text, type) as ConfigHolder;
  74. if (configHolder != null)
  75. {
  76. configHolder.Init();
  77. _allConfigHolders[configHolder.ConfigType] = configHolder;
  78. }
  79. else
  80. {
  81. LogTool.Error($"JSON转{type.Name}失败!");
  82. }
  83. }
  84. else
  85. {
  86. LogTool.Error($"配置文件类{type.Name}没有添加ConfigAttribute!");
  87. }
  88. }
  89. catch (Exception e)
  90. {
  91. LogTool.Error("导表错误" + type);
  92. LogTool.Exception(e);
  93. }
  94. }
  95. TextAsset multiSheetInfo =
  96. AssetDatabase.LoadAssetAtPath<TextAsset>(@"Assets\Res\Config\multiSheetInfo.json");
  97. if (multiSheetInfo != null)
  98. {
  99. MultiSheetInfoGroup multiSheetInfoGroup =
  100. JsonManager.FromJson<MultiSheetInfoGroup>(multiSheetInfo.text);
  101. LogTool.Log("加载多表配置" + multiSheetInfoGroup.MultiSheetInfos.Count);
  102. }
  103. LogTool.Log("所有配置文件初始化完成");
  104. }
  105. #endif
  106. /// <summary>
  107. /// 预先加载所有配置文件
  108. /// </summary>
  109. /// <param name="isLogin">登录的时候只加载指定列表里面的数据,这样可以减少加载时间</param>
  110. public async CTask Preload()
  111. {
  112. _allConfigHolders.Clear();
  113. ConfigHolder configHolder = null;
  114. Assembly gameDataAssembly = EventSystem.Instance.GetAssembly("Fort23.GameData.dll");
  115. if (gameDataAssembly == null)
  116. {
  117. LogTool.Error("Fort23.GameData资源加载失败");
  118. return;
  119. }
  120. AssetHandle multiSheetInfoTask =
  121. await AssetBundleLoadManager.Instance.LoadAssetAsyncTask<TextAsset>("multiSheetInfo.json");
  122. if (multiSheetInfoTask != null)
  123. {
  124. TextAsset textAsset = multiSheetInfoTask.AssetObject<TextAsset>();
  125. multiSheetInfoGroup = JsonManager.FromJson<MultiSheetInfoGroup>(textAsset.text);
  126. LogTool.Log("加载多表配置" + multiSheetInfoGroup.MultiSheetInfos.Count);
  127. }
  128. CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
  129. foreach (Type type in gameDataAssembly.GetTypes())
  130. {
  131. object[] attrs = type.GetCustomAttributes(typeof(ConfigAttribute), false);
  132. if (attrs.Length == 0)
  133. {
  134. continue;
  135. }
  136. try
  137. {
  138. ConfigAttribute configAttribute =
  139. type.GetCustomAttribute(typeof(ConfigAttribute)) as ConfigAttribute;
  140. if (configAttribute != null)
  141. {
  142. CTask<AssetHandle> cTask = AssetBundleLoadManager.Instance.LoadAssetAsyncTask<TextAsset>(
  143. configAttribute.prefab, callBack: delegate(AssetHandle json)
  144. {
  145. if (json == null)
  146. {
  147. LogTool.Error("加载配置表错误" + configAttribute.prefab);
  148. return;
  149. }
  150. bool isRoot = false;
  151. string[] prefab = configAttribute.prefab.Split("_");
  152. string rootName = prefab[0].Split(".")[0];
  153. if (prefab.Length > 1)
  154. {
  155. MultiSheetInfo multiSheetInfo =
  156. multiSheetInfoGroup.GetMultiSheetInfo(prefab[0]);
  157. if (multiSheetInfo != null)
  158. {
  159. multiSheetInfo.childrenAssetHandle.Add(json);
  160. return;
  161. }
  162. }
  163. else
  164. {
  165. MultiSheetInfo multiSheetInfo =
  166. multiSheetInfoGroup.GetMultiSheetInfo(rootName);
  167. if (multiSheetInfo != null)
  168. {
  169. isRoot = true;
  170. }
  171. }
  172. configHolder =
  173. JsonHelper.FromJson(json.AssetObject<TextAsset>().text, type) as ConfigHolder;
  174. json.Release();
  175. // TODO 验证服预留
  176. try
  177. {
  178. if (configHolder != null)
  179. {
  180. configHolder.Init();
  181. _allConfigHolders[configHolder.ConfigType] = configHolder;
  182. if (isRoot)
  183. {
  184. multiSheetInfoGroup.rootType.Add(rootName, configHolder);
  185. }
  186. }
  187. else
  188. {
  189. LogTool.Error($"JSON转{type.Name}失败!");
  190. }
  191. }
  192. catch (Exception e)
  193. {
  194. LogTool.Error(e);
  195. LogTool.Error($"JSON转{type.Name}失败!");
  196. }
  197. #if !COMBAT_SERVER
  198. });
  199. cTaskAwaitBuffer.AddTask(cTask);
  200. #endif
  201. }
  202. else
  203. {
  204. LogTool.Error($"配置文件类{type.Name}没有添加ConfigAttribute!");
  205. }
  206. }
  207. catch (Exception e)
  208. {
  209. LogTool.Error("导表错误" + type);
  210. LogTool.Exception(e);
  211. }
  212. }
  213. await cTaskAwaitBuffer.WaitAll();
  214. for (int i = 0; i < multiSheetInfoGroup.MultiSheetInfos.Count; i++)
  215. {
  216. MultiSheetInfo multiSheetInfo = multiSheetInfoGroup.MultiSheetInfos[i];
  217. ConfigHolder rootConfig = multiSheetInfoGroup.rootType[multiSheetInfo.key];
  218. for (int j = 0; j < multiSheetInfo.childrenAssetHandle.Count; j++)
  219. {
  220. AssetHandle assetHandle = multiSheetInfo.childrenAssetHandle[j];
  221. ConfigHolder childConfig =
  222. JsonHelper.FromJson(assetHandle.AssetObject<TextAsset>().text, rootConfig.GetType()) as
  223. ConfigHolder;
  224. childConfig.Init();
  225. rootConfig.AddChild(childConfig);
  226. assetHandle.Release();
  227. }
  228. multiSheetInfo.childrenAssetHandle.Clear();
  229. }
  230. multiSheetInfoGroup.rootType.Clear();
  231. multiSheetInfoGroup.MultiSheetInfos.Clear();
  232. // tasks.Dispose();
  233. LogTool.Log("所有配置文件初始化完成");
  234. }
  235. #endif
  236. public T Get<T>(int ID) where T : struct, IConfig
  237. {
  238. ConfigHolder configHolder;
  239. if (!_allConfigHolders.TryGetValue(typeof(T), out configHolder))
  240. {
  241. LogTool.Exception(new Exception($"ConfigComponent not found key: {typeof(T).FullName}"));
  242. return default;
  243. }
  244. IConfig iconfig = configHolder.TryGet(ID);
  245. return iconfig is T ? (T)iconfig : default;
  246. }
  247. public T[] GetAll<T>() where T : struct, IConfig
  248. {
  249. ConfigHolder configHolder;
  250. if (!_allConfigHolders.TryGetValue(typeof(T), out configHolder))
  251. {
  252. throw new Exception($"ConfigComponent not found key: {typeof(T).FullName}");
  253. }
  254. List<IConfig> lists = configHolder.GetAll();
  255. T[] configs = new T[configHolder.GetAll().Count];
  256. for (int i = 0; i < configs.Length; i++)
  257. {
  258. IConfig iconfig = lists[i];
  259. configs[i] = iconfig is T ? (T)iconfig : default;
  260. }
  261. return configs;
  262. }
  263. }
  264. }