GameDatabase.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using Game.Config;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Reflection;
  7. using UnityEngine;
  8. public abstract class GameData
  9. {
  10. public int ID;
  11. public abstract string FlieName();
  12. }
  13. public abstract class GameData<T> : GameData where T : GameData
  14. {
  15. protected static Dictionary<int, T> configDatas = new Dictionary<int, T>();
  16. protected static string[] fields;
  17. protected static string[] types;
  18. public override string FlieName()
  19. {
  20. return "";
  21. }
  22. protected static void Onload(CsvReader csvReader)
  23. {
  24. configDatas.Clear();
  25. string[][] datas = csvReader.RowDatas;
  26. fields = csvReader.Fields();
  27. types = csvReader.Types();
  28. int length = datas.Length;
  29. bool IsHasID = csvReader.HasField("ID");
  30. for (int i = csvReader.StartLine; i < length; i++)
  31. {
  32. T data = ExcelParser.Serializable<T>(fields, datas[i]);
  33. //Debug.Log(data.FlieName() + data.ID);
  34. if (!IsHasID)
  35. {
  36. data.ID = configDatas.Count;
  37. }
  38. configDatas.Add(data.ID, data);
  39. }
  40. }
  41. public static T GetData(int id)
  42. {
  43. T data = null;
  44. if (configDatas.ContainsKey(id))
  45. data = configDatas[id];
  46. return data;
  47. }
  48. public static T[] Where(Func<T, bool> func)
  49. {
  50. return configDatas.Values.Where(func).ToArray();
  51. }
  52. public static T Find(Func<T, bool> func)
  53. {
  54. T data = configDatas.Values.Where(func).FirstOrDefault();
  55. return data;
  56. }
  57. public static void Foreach( Action<T> action)
  58. {
  59. List<T> datas = AllData();
  60. int length = datas.Count;
  61. for (int i = 0; i < length; i++)
  62. {
  63. action?.Invoke(datas[i]);
  64. }
  65. }
  66. public static void Clear(bool isClear = true)
  67. {
  68. configDatas.Clear();
  69. if (isClear)
  70. {
  71. fields = null;
  72. types = null;
  73. }
  74. }
  75. public static List<T> AllData()
  76. {
  77. return configDatas.Values.ToList();
  78. }
  79. public void Delete()
  80. {
  81. if (configDatas.ContainsKey(ID))
  82. {
  83. configDatas.Remove(ID);
  84. }
  85. }
  86. public static void AddNewData(T data)
  87. {
  88. int id = GetNextIndex();
  89. data.ID = id;
  90. configDatas.Add(id,data);
  91. }
  92. public static string WriteToFile(string path = null)
  93. {
  94. GameDataFormatInfo info = new GameDataFormatInfo(fields, types);
  95. Type type = typeof(T);
  96. T obj = Activator.CreateInstance<T>();
  97. CsvWriter<T> csvWriter = new CsvWriter<T>(path, obj.FlieName(), configDatas.Values.ToList(), info);
  98. if (!string.IsNullOrEmpty(path))
  99. {
  100. csvWriter.Write();
  101. }
  102. return csvWriter.Data;
  103. }
  104. public static GameDataFormatInfo GetFormatInfo()
  105. {
  106. return new GameDataFormatInfo(fields, types);
  107. }
  108. private static int GetNextIndex()
  109. {
  110. int max = 0;
  111. if (configDatas.Count > 0)
  112. {
  113. max = configDatas.Keys.OrderBy(x => x).Max();
  114. }
  115. return max + 1;
  116. }
  117. }
  118. public enum ConfigMode
  119. {
  120. OnAsset,
  121. OnMemory,
  122. }
  123. public class GameDataFormatInfo
  124. {
  125. public string[] Fileds;
  126. public string[] Types;
  127. public GameDataFormatInfo(string[] fs, string[] ts)
  128. {
  129. this.Fileds = fs;
  130. this.Types = ts;
  131. }
  132. }
  133. //public class GameDatabase : Singleton<GameDatabase>
  134. //{
  135. // private Dictionary<string, GameDataFormatInfo> formatInfos;
  136. // private ConfigMode configMode;
  137. // private string bundleName;
  138. // //public void Init(string bundleName, ConfigMode mode = ConfigMode.OnMemory)
  139. // //{
  140. // // configMode = mode;
  141. // // formatInfos = new Dictionary<string, GameDataFormatInfo>();
  142. // // this.bundleName = bundleName;
  143. // // LoadDatabase(new ConfigPathInfo().Paths.ToArray());
  144. // //}
  145. // //public void LoadDatabase(string[] paths)
  146. // //{
  147. // // if (configMode == ConfigMode.OnAsset || paths == null || paths.Length == 0)
  148. // // return;
  149. // // ResourcesManager resmgr = ResourcesManager.Instance;
  150. // // int length = paths.Length;
  151. // // for (int i = 0; i < length; i++)
  152. // // {
  153. // // Debug.Log(paths[i]);
  154. // // int index = i;
  155. // // resmgr.LoadAssetNoDependencisAsync<TextAsset>(paths[index], bundleName, txt =>
  156. // // {
  157. // // string name = FileHelper.GetName(paths[index]);
  158. // // CsvReader csvReader = new CsvReader(name, txt.bytes);
  159. // // Type type = Type.GetType(FileHelper.GetConfigClassFullName(name));
  160. // // MethodInfo methodInfo = type.GetMethod("OnCsvLoad", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
  161. // // methodInfo?.Invoke(null, new object[] { csvReader });
  162. // // formatInfos.Add(name, new GameDataFormatInfo(csvReader.Fields(), csvReader.Types()));
  163. // // });
  164. // // }
  165. // // //resmgr.UnLoad(bundleName);
  166. // //}
  167. // public static void LoadDataBaseFormMemory<T>(byte[] data) where T: GameData
  168. // {
  169. // Type type = typeof(T);
  170. // CsvReader csvReader = new CsvReader(type.Name, data);
  171. // MethodInfo methodInfo = type.GetMethod("OnCsvLoad", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
  172. // methodInfo?.Invoke(null, new object[] { csvReader });
  173. // }
  174. // public GameDataFormatInfo GetGameDataFormatInfo(string name)
  175. // {
  176. // GameDataFormatInfo ret = null;
  177. // if (formatInfos.ContainsKey(name))
  178. // ret = formatInfos[name];
  179. // return ret;
  180. // }
  181. // private Dictionary<int, GameData> GetConfigDatas(CsvReader reader)
  182. // {
  183. // Dictionary<int, GameData> gameDatas = new Dictionary<int, GameData>();
  184. // string[][] datas = reader.RowDatas;
  185. // string[] fields = reader.Fields();
  186. // int length = datas.Length;
  187. // for (int i = 2; i < length; i++)
  188. // {
  189. // GameData gameData = ExcelParser.Serializable(Type.GetType($"Game.Config.{reader.Name}"), fields, datas[i]);
  190. // gameDatas.Add(gameData.ID, gameData);
  191. // }
  192. // return gameDatas;
  193. // }
  194. //}