CodeBuilder.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.IO;
  6. using System.Text;
  7. using UnityEngine;
  8. using GFGGame;
  9. using System.Text.RegularExpressions;
  10. using static Google.Protobuf.Reflection.GeneratedCodeInfo.Types;
  11. using OfficeOpenXml;
  12. namespace GFGEditor
  13. {
  14. public class CodeBuilder
  15. {
  16. private const string SQL_PREFIX = "_";
  17. private static StringBuilder _declarationBuilder = new StringBuilder();
  18. private static StringBuilder _assignmentBuilder = new StringBuilder();
  19. private static StringBuilder _parseBuilder = new StringBuilder();
  20. //private static bool _hasSameIds;
  21. private static List<string> _names = new List<string>();
  22. private static List<string> _types = new List<string>();
  23. private static List<int> _indexs = new List<int>();
  24. private static Dictionary<string, string> _idDic = new Dictionary<string, string>();
  25. private static Dictionary<string, string> _itemTypeDicByName = new Dictionary<string, string>();
  26. public static void GenerateCode(ExcelWorksheet worksheet, string configName, string configArrayName)
  27. {
  28. ET.Log.Debug($"configName {configName}");
  29. _declarationBuilder.Clear();
  30. _assignmentBuilder.Clear();
  31. _parseBuilder.Clear();
  32. _names.Clear();
  33. _types.Clear();
  34. _idDic.Clear();
  35. _indexs.Clear();
  36. //_hasSameIds = false;
  37. List<string> keyNames = new List<string>();
  38. List<string> keyTypes = new List<string>();
  39. List<string> groupNames = new List<string>();
  40. List<string> groupTypes = new List<string>();
  41. bool groupOnly = false;
  42. int len = worksheet.Dimension.End.Column;
  43. if (len <= 0)
  44. {
  45. return;
  46. }
  47. for (int i = 1; i <= len; ++i)
  48. {
  49. ET.Log.Debug($"GenerateCode for i {i}");
  50. string annotation = worksheet.Cells[1, i].Text.Trim();
  51. string type = worksheet.Cells[2, i].Text.Trim();
  52. string nameWhole = worksheet.Cells[3, i].Text.Trim();
  53. string[] nameInfos = nameWhole.Split('#');
  54. string name = nameInfos[0];
  55. if (i == 1 || nameWhole.Contains("#k"))
  56. {
  57. keyNames.Add(name);
  58. keyTypes.Add(type);
  59. }
  60. if (nameWhole.Contains("#g"))
  61. {
  62. groupNames.Add(name);
  63. groupTypes.Add(type);
  64. }
  65. ParseDataColumn(annotation, type, name, i);
  66. }
  67. if (keyNames.Count == groupNames.Count)
  68. {
  69. bool isSame = true;
  70. for (var i = 0; i < keyNames.Count; i++)
  71. {
  72. if (keyNames[i] != groupNames[i])
  73. {
  74. isSame = false;
  75. }
  76. }
  77. groupOnly = isSame;
  78. }
  79. //创建sqlite表
  80. SQLiteHelper.Instance.CreateTable(configArrayName, _names.ToArray(), _types.ToArray());
  81. AddDataToSql(worksheet, configName, configArrayName);
  82. //生成管理类代码
  83. string configArrayStr = CodeTemplateFactory.ConfigArrayTemplate;
  84. string paramsStr;
  85. string colNames;
  86. string colValues;
  87. _declarationBuilder.AppendFormat("\t\t//{0}", "组合key");
  88. _declarationBuilder.AppendLine();
  89. _declarationBuilder.AppendFormat("\t\tpublic {0} {1};", "string", "combinedKey");
  90. _declarationBuilder.AppendLine();
  91. //处理查询单条数据函数
  92. if (groupOnly)
  93. {
  94. configArrayStr = configArrayStr.Replace("{singleFunction}", "");
  95. _assignmentBuilder.AppendFormat("\t\t\t{0} = \"{1}\";", "combinedKey", string.Join("_", groupNames));
  96. _assignmentBuilder.AppendLine();
  97. }
  98. else
  99. {
  100. string FunctionSingleStr = CodeTemplateFactory.FunctionSingleTemplate;
  101. CreateParamsString(keyNames, keyTypes, out paramsStr, out colNames, out colValues);
  102. FunctionSingleStr = FunctionSingleStr.Replace("{params}", paramsStr);
  103. FunctionSingleStr = FunctionSingleStr.Replace("{colNames}", colNames);
  104. FunctionSingleStr = FunctionSingleStr.Replace("{colValues}", colValues);
  105. configArrayStr = configArrayStr.Replace("{singleFunction}", FunctionSingleStr);
  106. _assignmentBuilder.AppendFormat("\t\t\t{0} = \"{1}\";", "combinedKey", string.Join("_", keyNames));
  107. _assignmentBuilder.AppendLine();
  108. }
  109. //处理查询多条数据函数
  110. if (groupNames.Count > 0)
  111. {
  112. string FunctionGroupStr = CodeTemplateFactory.FunctionGroupTemplate;
  113. CreateParamsString(groupNames, groupTypes, out paramsStr, out colNames, out colValues);
  114. FunctionGroupStr = FunctionGroupStr.Replace("{params}", paramsStr);
  115. FunctionGroupStr = FunctionGroupStr.Replace("{colNames}", colNames);
  116. FunctionGroupStr = FunctionGroupStr.Replace("{colValues}", colValues);
  117. configArrayStr = configArrayStr.Replace("{groupFunction}", FunctionGroupStr);
  118. }
  119. else
  120. {
  121. configArrayStr = configArrayStr.Replace("{groupFunction}", "");
  122. }
  123. //处理全部数据函数
  124. string FunctionAllStr = CodeTemplateFactory.FunctionAllTemplate;
  125. configArrayStr = configArrayStr.Replace("{allFunction}", FunctionAllStr);
  126. //if (needAll)
  127. //{
  128. configArrayStr = configArrayStr.Replace("{editorConditionStart}", "");
  129. configArrayStr = configArrayStr.Replace("{editorConditionEnd}", "");
  130. //}
  131. //else
  132. //{
  133. // configArrayStr = configArrayStr.Replace("{editorConditionStart}", "#if UNITY_EDITOR");
  134. // configArrayStr = configArrayStr.Replace("{editorConditionEnd}", "#endif");
  135. //}
  136. //处理回调函数内语句块
  137. if (groupOnly)
  138. {
  139. configArrayStr = configArrayStr.Replace("{FunctionAllSingleBlock}", "");
  140. }
  141. else
  142. {
  143. configArrayStr = configArrayStr.Replace("{FunctionAllSingleBlock}", CodeTemplateFactory.FunctionAllSingleBlockTemplate);
  144. }
  145. if (groupNames.Count > 0)
  146. {
  147. configArrayStr = configArrayStr.Replace("{FunctionAllGroupBlock}", CodeTemplateFactory.FunctionAllGroupBlockTemplate);
  148. }
  149. else
  150. {
  151. configArrayStr = configArrayStr.Replace("{FunctionAllGroupBlock}", "");
  152. }
  153. //名称处理
  154. configArrayStr = configArrayStr.Replace("{CfgName}", configName);
  155. configArrayStr = configArrayStr.Replace("{CfgArrayName}", configArrayName);
  156. //生成反序列化代码
  157. string configStr = CodeTemplateFactory.ConfigTemplate.Replace("{CfgName}", configName);
  158. configStr = configStr.Replace("{variable declaration}", _declarationBuilder.ToString());
  159. configStr = configStr.Replace("{variable assignment}", _assignmentBuilder.ToString());
  160. configStr = configStr.Replace("{variable parse}", _parseBuilder.ToString());
  161. //创建配置项类代码
  162. using (StreamWriter sw = new StreamWriter(ExcelConfig.configCodePath + configName + ".cs"))
  163. {
  164. sw.Write(configStr);
  165. }
  166. //创建管理类代码
  167. using (StreamWriter sw = new StreamWriter(ExcelConfig.configArrayCodePath + configArrayName + ".cs"))
  168. {
  169. sw.Write(configArrayStr);
  170. }
  171. Debug.LogFormat("生成{0}", configName);
  172. }
  173. private static void ParseDataColumn(string annotation, string type, string name, int index)
  174. {
  175. if (type.Length > 0 && name.Length > 0)
  176. {
  177. _names.Add(SQL_PREFIX + name);
  178. _types.Add("TEXT");
  179. _indexs.Add(index);
  180. //生成解析后的数据变量
  181. _declarationBuilder.AppendFormat("\t\t//{0}", annotation);
  182. _declarationBuilder.AppendLine();
  183. if (type.Contains("[]"))
  184. {
  185. //_declarationBuilder.AppendFormat("\t\tpublic {0} {1};", "string", tempName);
  186. //_declarationBuilder.AppendLine();
  187. //_declarationBuilder.AppendLine("\t\t[NonSerialized]");
  188. _declarationBuilder.AppendFormat("\t\tpublic {0} {1}Arr;", type, name);
  189. _declarationBuilder.AppendLine();
  190. }
  191. else
  192. {
  193. _declarationBuilder.AppendFormat("\t\tpublic {0} {1};", type, name);
  194. _declarationBuilder.AppendLine();
  195. }
  196. //添加解析代码
  197. if (type == "int")
  198. {
  199. //_assignmentBuilder.AppendFormat("\t\t\t{0} = ConfigUtil.GetInt(0, dataRow, {1});", name, index);
  200. _assignmentBuilder.AppendFormat("\t\t\t{0} = ConfigUtil.GetInt(reader.GetString(reader.GetOrdinal(\"_{1}\")));", name, name);
  201. _assignmentBuilder.AppendLine();
  202. }
  203. else if (type == "float")
  204. {
  205. _assignmentBuilder.AppendFormat("\t\t\t{0} = ConfigUtil.GetFloat(reader.GetString(reader.GetOrdinal(\"_{1}\")));", name, name);
  206. _assignmentBuilder.AppendLine();
  207. }
  208. else if (type == "string")
  209. {
  210. _assignmentBuilder.AppendFormat("\t\t\t{0} = reader.GetString(reader.GetOrdinal(\"_{1}\"));", name, name);
  211. _assignmentBuilder.AppendLine();
  212. }
  213. else
  214. {
  215. _assignmentBuilder.AppendFormat("\t\t\tvar temp{0} = reader.GetString(reader.GetOrdinal(\"_{1}\"));", name, name);
  216. _assignmentBuilder.AppendLine();
  217. if (type.Contains("[][]"))
  218. {
  219. string subType = type.Replace("[][]", "");
  220. _assignmentBuilder.AppendFormat("\t\t\t{0}Arr = ConfigUtil.GetTwoDimensionalArr<{1}>(temp{2});", name, subType, name);
  221. _assignmentBuilder.AppendLine();
  222. }
  223. else if (type.Contains("[]"))
  224. {
  225. string subType = type.Replace("[]", "");
  226. _assignmentBuilder.AppendFormat("\t\t\t{0}Arr = ConfigUtil.GetLinearArr<{1}>(temp{2});", name, subType, name);
  227. _assignmentBuilder.AppendLine();
  228. }
  229. }
  230. }
  231. }
  232. private static void AddDataToSql(ExcelWorksheet worksheet, string configName, string configArrayName)
  233. {
  234. int rowNum = worksheet.Dimension.End.Row;
  235. for (int i = 5; i <= rowNum; i++)
  236. {
  237. string key = worksheet.Cells[i, 1].Text.Trim();
  238. if (key.Length == 0)
  239. {
  240. continue;
  241. }
  242. //解析每行的数据
  243. WriteRowDataToSqlite(worksheet.Cells, configArrayName, i);
  244. if (_idDic.ContainsKey(key))
  245. {
  246. //_hasSameIds = true;
  247. }
  248. else
  249. {
  250. _idDic[key] = key;
  251. }
  252. }
  253. }
  254. private static void WriteRowDataToSqlite(ExcelRange excelRange, string configArrayName, int row)
  255. {
  256. List<string> values = new List<string>();
  257. var keyValue = excelRange[row, 1].Text.Trim();
  258. foreach (var i in _indexs)
  259. {
  260. var fieldName = _names[i-1];
  261. var value = excelRange[row, i].Text.Trim();
  262. if (configArrayName == nameof(ItemTypeCfgArray))
  263. {
  264. CacheItemTypeByName(keyValue, fieldName, value);
  265. }
  266. else if (configArrayName == nameof(ItemCfgArray))
  267. {
  268. HandleItemCfgField(keyValue, fieldName, ref value);
  269. }
  270. //value = Regex.Replace(value, ":", "/:");
  271. values.Add(value);
  272. }
  273. SQLiteHelper.Instance.InsertValues(configArrayName, values.ToArray());
  274. }
  275. private static void CacheItemTypeByName(string idStr, string fieldName, string value)
  276. {
  277. if (fieldName == SQL_PREFIX + "name")
  278. {
  279. _itemTypeDicByName[value] = idStr;
  280. }
  281. }
  282. private static void HandleItemCfgField(string idStr, string fieldName, ref string value)
  283. {
  284. fieldName = fieldName.Substring(1);
  285. ET.Log.Debug($"idStr {idStr} fieldName {fieldName} value {value}");
  286. int id = int.Parse(idStr);
  287. int itemType = (int)Mathf.Floor(id / GameConst.MAX_COUNT_EVERY_TYPE_ITEM);
  288. if (fieldName == "itemType")
  289. {
  290. if (itemType <= ConstDressUpItemType.MAX)
  291. {
  292. value = ConstItemType.DRESS_UP.ToString();
  293. }
  294. else
  295. {
  296. value = itemType.ToString();
  297. }
  298. }
  299. else if (fieldName == "subType")
  300. {
  301. if (itemType <= ConstDressUpItemType.MAX)
  302. {
  303. string subType;
  304. if (_itemTypeDicByName.TryGetValue(value, out subType))
  305. {
  306. value = subType;
  307. }
  308. else
  309. {
  310. Debug.LogError($"请检查物品 {idStr} 的subType值");
  311. }
  312. }
  313. }
  314. else if (fieldName == "resLayer1" || fieldName == "resLayer2")
  315. {
  316. value = value.Replace('n', '1');
  317. value = value.Replace('t', '2');
  318. }
  319. }
  320. private static void CreateParamsString(List<string> keyNames, List<string> keyTypes, out string paramStr, out string colNames, out string colValues)
  321. {
  322. paramStr = "";
  323. colNames = "";
  324. colValues = "";
  325. for (var i = 0; i < keyNames.Count; i++)
  326. {
  327. paramStr += keyTypes[i] + " " + keyNames[i];
  328. colNames += $"nameof({keyNames[i]})";
  329. colValues += $"{keyNames[i]}.ToString()";
  330. if (i < keyNames.Count - 1)
  331. {
  332. paramStr += ", ";
  333. colNames += ", ";
  334. colValues += ", ";
  335. }
  336. }
  337. }
  338. }
  339. }