CodeBuilder.cs 15 KB

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