using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; using System.Text; using UnityEngine; using GFGGame; using System.Text.RegularExpressions; using static Google.Protobuf.Reflection.GeneratedCodeInfo.Types; using OfficeOpenXml; namespace GFGEditor { public class CodeBuilder { private const string SQL_PREFIX = "_"; private static StringBuilder _declarationBuilder = new StringBuilder(); private static StringBuilder _assignmentBuilder = new StringBuilder(); private static StringBuilder _parseBuilder = new StringBuilder(); //private static bool _hasSameIds; private static List _names = new List(); private static List _types = new List(); private static List _indexs = new List(); private static Dictionary _idDic = new Dictionary(); private static Dictionary _itemTypeDicByName = new Dictionary(); public static void GenerateCode(ExcelWorksheet worksheet, string configName, string configArrayName) { ET.Log.Debug($"configName {configName}"); _declarationBuilder.Clear(); _assignmentBuilder.Clear(); _parseBuilder.Clear(); _names.Clear(); _types.Clear(); _idDic.Clear(); _indexs.Clear(); //_hasSameIds = false; List keyNames = new List(); List keyTypes = new List(); List groupNames = new List(); List groupTypes = new List(); bool groupOnly = false; int len = worksheet.Dimension.End.Column; if (len <= 0) { return; } for (int i = 1; i <= len; ++i) { ET.Log.Debug($"GenerateCode for i {i}"); string annotation = worksheet.Cells[1, i].Text.Trim(); string type = worksheet.Cells[2, i].Text.Trim(); string nameWhole = worksheet.Cells[3, i].Text.Trim(); string[] nameInfos = nameWhole.Split('#'); string name = nameInfos[0]; if (i == 1 || nameWhole.Contains("#k")) { keyNames.Add(name); keyTypes.Add(type); } if (nameWhole.Contains("#g")) { groupNames.Add(name); groupTypes.Add(type); } ParseDataColumn(annotation, type, name, i); } if (keyNames.Count == groupNames.Count) { bool isSame = true; for (var i = 0; i < keyNames.Count; i++) { if (keyNames[i] != groupNames[i]) { isSame = false; } } groupOnly = isSame; } //创建sqlite表 SQLiteHelper.Instance.CreateTable(configArrayName, _names.ToArray(), _types.ToArray()); AddDataToSql(worksheet, configName, configArrayName); //生成管理类代码 string configArrayStr = CodeTemplateFactory.ConfigArrayTemplate; string paramsStr; string colNames; string colValues; _declarationBuilder.AppendFormat("\t\t//{0}", "组合key"); _declarationBuilder.AppendLine(); _declarationBuilder.AppendFormat("\t\tpublic {0} {1};", "string", "combinedKey"); _declarationBuilder.AppendLine(); //处理查询单条数据函数 if (groupOnly) { configArrayStr = configArrayStr.Replace("{singleFunction}", ""); _assignmentBuilder.AppendFormat("\t\t\t{0} = \"{1}\";", "combinedKey", string.Join("_", groupNames)); _assignmentBuilder.AppendLine(); } else { string FunctionSingleStr = CodeTemplateFactory.FunctionSingleTemplate; CreateParamsString(keyNames, keyTypes, out paramsStr, out colNames, out colValues); FunctionSingleStr = FunctionSingleStr.Replace("{params}", paramsStr); FunctionSingleStr = FunctionSingleStr.Replace("{colNames}", colNames); FunctionSingleStr = FunctionSingleStr.Replace("{colValues}", colValues); configArrayStr = configArrayStr.Replace("{singleFunction}", FunctionSingleStr); _assignmentBuilder.AppendFormat("\t\t\t{0} = \"{1}\";", "combinedKey", string.Join("_", keyNames)); _assignmentBuilder.AppendLine(); } //处理查询多条数据函数 if (groupNames.Count > 0) { string FunctionGroupStr = CodeTemplateFactory.FunctionGroupTemplate; CreateParamsString(groupNames, groupTypes, out paramsStr, out colNames, out colValues); FunctionGroupStr = FunctionGroupStr.Replace("{params}", paramsStr); FunctionGroupStr = FunctionGroupStr.Replace("{colNames}", colNames); FunctionGroupStr = FunctionGroupStr.Replace("{colValues}", colValues); configArrayStr = configArrayStr.Replace("{groupFunction}", FunctionGroupStr); } else { configArrayStr = configArrayStr.Replace("{groupFunction}", ""); } //处理全部数据函数 string FunctionAllStr = CodeTemplateFactory.FunctionAllTemplate; configArrayStr = configArrayStr.Replace("{allFunction}", FunctionAllStr); //if (needAll) //{ configArrayStr = configArrayStr.Replace("{editorConditionStart}", ""); configArrayStr = configArrayStr.Replace("{editorConditionEnd}", ""); //} //else //{ // configArrayStr = configArrayStr.Replace("{editorConditionStart}", "#if UNITY_EDITOR"); // configArrayStr = configArrayStr.Replace("{editorConditionEnd}", "#endif"); //} //处理回调函数内语句块 if (groupOnly) { configArrayStr = configArrayStr.Replace("{FunctionAllSingleBlock}", ""); } else { configArrayStr = configArrayStr.Replace("{FunctionAllSingleBlock}", CodeTemplateFactory.FunctionAllSingleBlockTemplate); } if (groupNames.Count > 0) { configArrayStr = configArrayStr.Replace("{FunctionAllGroupBlock}", CodeTemplateFactory.FunctionAllGroupBlockTemplate); } else { configArrayStr = configArrayStr.Replace("{FunctionAllGroupBlock}", ""); } //名称处理 configArrayStr = configArrayStr.Replace("{CfgName}", configName); configArrayStr = configArrayStr.Replace("{CfgArrayName}", configArrayName); //生成反序列化代码 string configStr = CodeTemplateFactory.ConfigTemplate.Replace("{CfgName}", configName); configStr = configStr.Replace("{variable declaration}", _declarationBuilder.ToString()); configStr = configStr.Replace("{variable assignment}", _assignmentBuilder.ToString()); configStr = configStr.Replace("{variable parse}", _parseBuilder.ToString()); //创建配置项类代码 using (StreamWriter sw = new StreamWriter(ExcelConfig.configCodePath + configName + ".cs")) { sw.Write(configStr); } //创建管理类代码 using (StreamWriter sw = new StreamWriter(ExcelConfig.configArrayCodePath + configArrayName + ".cs")) { sw.Write(configArrayStr); } Debug.LogFormat("生成{0}", configName); } private static void ParseDataColumn(string annotation, string type, string name, int index) { if (type.Length > 0 && name.Length > 0) { _names.Add(SQL_PREFIX + name); _types.Add("TEXT"); _indexs.Add(index); //生成解析后的数据变量 _declarationBuilder.AppendFormat("\t\t//{0}", annotation); _declarationBuilder.AppendLine(); if (type.Contains("[]")) { //_declarationBuilder.AppendFormat("\t\tpublic {0} {1};", "string", tempName); //_declarationBuilder.AppendLine(); //_declarationBuilder.AppendLine("\t\t[NonSerialized]"); _declarationBuilder.AppendFormat("\t\tpublic {0} {1}Arr;", type, name); _declarationBuilder.AppendLine(); } else { _declarationBuilder.AppendFormat("\t\tpublic {0} {1};", type, name); _declarationBuilder.AppendLine(); } //添加解析代码 if (type == "int") { //_assignmentBuilder.AppendFormat("\t\t\t{0} = ConfigUtil.GetInt(0, dataRow, {1});", name, index); _assignmentBuilder.AppendFormat("\t\t\t{0} = ConfigUtil.GetInt(reader.GetString(reader.GetOrdinal(\"_{1}\")));", name, name); _assignmentBuilder.AppendLine(); } else if (type == "float") { _assignmentBuilder.AppendFormat("\t\t\t{0} = ConfigUtil.GetFloat(reader.GetString(reader.GetOrdinal(\"_{1}\")));", name, name); _assignmentBuilder.AppendLine(); } else if (type == "string") { _assignmentBuilder.AppendFormat("\t\t\t{0} = reader.GetString(reader.GetOrdinal(\"_{1}\"));", name, name); _assignmentBuilder.AppendLine(); } else { _assignmentBuilder.AppendFormat("\t\t\tvar temp{0} = reader.GetString(reader.GetOrdinal(\"_{1}\"));", name, name); _assignmentBuilder.AppendLine(); if (type.Contains("[][]")) { string subType = type.Replace("[][]", ""); _assignmentBuilder.AppendFormat("\t\t\t{0}Arr = ConfigUtil.GetTwoDimensionalArr<{1}>(temp{2});", name, subType, name); _assignmentBuilder.AppendLine(); } else if (type.Contains("[]")) { string subType = type.Replace("[]", ""); _assignmentBuilder.AppendFormat("\t\t\t{0}Arr = ConfigUtil.GetLinearArr<{1}>(temp{2});", name, subType, name); _assignmentBuilder.AppendLine(); } } } } private static void AddDataToSql(ExcelWorksheet worksheet, string configName, string configArrayName) { int rowNum = worksheet.Dimension.End.Row; for (int i = 5; i <= rowNum; i++) { string key = worksheet.Cells[i, 1].Text.Trim(); if (key.Length == 0) { continue; } //解析每行的数据 WriteRowDataToSqlite(worksheet.Cells, configArrayName, i); if (_idDic.ContainsKey(key)) { //_hasSameIds = true; } else { _idDic[key] = key; } } } private static void WriteRowDataToSqlite(ExcelRange excelRange, string configArrayName, int row) { List values = new List(); var keyValue = excelRange[row, 1].Text.Trim(); foreach (var i in _indexs) { var fieldName = _names[i-1]; var value = excelRange[row, i].Text.Trim(); if (configArrayName == nameof(ItemTypeCfgArray)) { CacheItemTypeByName(keyValue, fieldName, value); } else if (configArrayName == nameof(ItemCfgArray)) { HandleItemCfgField(keyValue, fieldName, ref value); } //value = Regex.Replace(value, ":", "/:"); values.Add(value); } SQLiteHelper.Instance.InsertValues(configArrayName, values.ToArray()); } private static void CacheItemTypeByName(string idStr, string fieldName, string value) { if (fieldName == SQL_PREFIX + "name") { _itemTypeDicByName[value] = idStr; } } private static void HandleItemCfgField(string idStr, string fieldName, ref string value) { fieldName = fieldName.Substring(1); ET.Log.Debug($"idStr {idStr} fieldName {fieldName} value {value}"); int id = int.Parse(idStr); int itemType = (int)Mathf.Floor(id / GameConst.MAX_COUNT_EVERY_TYPE_ITEM); if (fieldName == "itemType") { if (itemType <= ConstDressUpItemType.MAX) { value = ConstItemType.DRESS_UP.ToString(); } else { value = itemType.ToString(); } } else if (fieldName == "subType") { if (itemType <= ConstDressUpItemType.MAX) { string subType; if (_itemTypeDicByName.TryGetValue(value, out subType)) { value = subType; } else { Debug.LogError($"请检查物品 {idStr} 的subType值"); } } } else if (fieldName == "resLayer1" || fieldName == "resLayer2") { value = value.Replace('n', '1'); value = value.Replace('t', '2'); } } private static void CreateParamsString(List keyNames, List keyTypes, out string paramStr, out string colNames, out string colValues) { paramStr = ""; colNames = ""; colValues = ""; for (var i = 0; i < keyNames.Count; i++) { paramStr += keyTypes[i] + " " + keyNames[i]; colNames += $"nameof({keyNames[i]})"; colValues += $"{keyNames[i]}.ToString()"; if (i < keyNames.Count - 1) { paramStr += ", "; colNames += ", "; colValues += ", "; } } } } }