using System.Collections; using System.Collections.Generic; using UnityEditor.ProjectWindowCallback; using UnityEngine; using UnityEditor; using System.IO; using System.Text; using System.Text.RegularExpressions; using System; using UnityEngine.Events; public class CreateConfigClassFile { const string retract1 = "\t"; const string retract2 = "\t\t"; const string retract3 = "\t\t\t"; const string retract4 = "\t\t\t\t"; const string retract5 = "\t\t\t\t\t"; public static event UnityAction FileCreateEvent; public static string filedContent = string.Empty; public static string readContent = string.Empty; public static string fieldKey = string.Empty; [UnityEditor.MenuItem("Assets/生成配置解析类型1")] public static void GenerateConfigClass1() { if (Selection.objects != null) { foreach (var o in Selection.objects) { var path = AssetDatabase.GetAssetPath(o.GetInstanceID()); if (path.EndsWith(".txt") || path.EndsWith(".TXT")) { CreateConfigClass(new FileInfo(path)); } } } ConfigGenerater.Generate(); AssetDatabase.Refresh(); } public static void CreateConfigClass(FileInfo fileInfo, bool isIL = false) { var lines = File.ReadAllLines(fileInfo.FullName); if (lines.Length > 2) { var typeLine = lines[0]; var fieldLine = lines[1]; var types = typeLine.Split('\t'); var fields = fieldLine.Split('\t'); var min = Mathf.Min(types.Length, fields.Length); var fieldFulls = new List(); var readFulls = new List(); string fieldKey = string.Empty; int index = 0; for (int j = 0; j < min; j++) { var type = types[j]; var field = fields[j]; var fieldType = GetFieldType(type); var fieldstring = GetField(type, field); var readString = GetRead(type, field, index); if (!string.IsNullOrEmpty(fieldstring)) { fieldFulls.Add(fieldstring); if (string.IsNullOrEmpty(fieldKey) && !string.IsNullOrEmpty(fieldType)) { fieldKey = fieldType; } } if (!string.IsNullOrEmpty(readString)) { index++; readFulls.Add(readString); } } filedContent = string.Join("\r\n\t", fieldFulls.ToArray()); readContent = string.Join("\r\n\r\n\t\t\t", readFulls.ToArray()); CreatNewConfigClass(fileInfo.Name.Substring(0, fileInfo.Name.IndexOf('.')), fieldKey); } } public static string GetLoadField(string type, string field) { field = field.Replace(" ", ""); if (type.Contains("int[][]")) { return StringUtility.Contact("public int[][] ", field.Trim(), ";"); } else if (type.Contains("Dictionary")) { return StringUtility.Contact("public Dictionary ", field.Trim(), ";"); } else if (type.Contains("Dictionary")) { return StringUtility.Contact("public Dictionary ", field.Trim(), ";"); } else if (type.Contains("float[][]")) { return StringUtility.Contact("public float[][] ", field.Trim(), ";"); } else if (type.Contains("int[]")) { return StringUtility.Contact("public int[] ", field.Trim(), ";"); } else if (type.Contains("Int2[]")) { return StringUtility.Contact("public Int2[] ", field.Trim(), ";"); } else if (type.Contains("Int3[]")) { return StringUtility.Contact("public Int3[] ", field.Trim(), ";"); } else if (type.Contains("float[]")) { return StringUtility.Contact("public float[] ", field.Trim(), ";"); } else if (type.Contains("string[]")) { return StringUtility.Contact("public string[] ", field.Trim(), ";"); } else if (type.Contains("Vector3[]")) { return StringUtility.Contact("public Vector3[] ", field.Trim(), ";"); } else if (type.Contains("int")) { return StringUtility.Contact("public int ", field.Trim(), ";"); } else if (type.Contains("long")) { return StringUtility.Contact("public long ", field.Trim(), ";"); } else if (type.Contains("float")) { return StringUtility.Contact("public float ", field.Trim(), ";"); } else if (type.Contains("string")) { return StringUtility.Contact("public string ", field, ";"); } else if (type.Contains("Vector3")) { return StringUtility.Contact("public Vector3 ", field.Trim(), ";"); } else if (type.Contains("bool")) { return StringUtility.Contact("public bool ", field.Trim(), ";"); } else if (type.Contains("Int2")) { return StringUtility.Contact("public Int2 ", field.Trim(), ";"); } else if (type.Contains("Int3")) { return StringUtility.Contact("public Int3 ", field.Trim(), ";"); } else { return string.Empty; } } public static string GetFieldType(string type) { if (type.Contains("int[][]")) { return "int[][]"; } else if (type.Contains("Dictionary")) { return "Dictionary"; } else if (type.Contains("Dictionary")) { return "Dictionary"; } else if (type.Contains("float[][]")) { return "float[][]"; } else if (type.Contains("int[]")) { return "int[]"; } // else if (type.Contains("Int2[]")) // { // return StringUtility.Contact("public Int2[] ", field.Trim(), ";"); // } // else if (type.Contains("Int3[]")) // { // return StringUtility.Contact("public Int3[] ", field.Trim(), ";"); // } else if (type.Contains("float[]")) { return "float[]"; } else if (type.Contains("string[]")) { return "string[]"; } else if (type.Contains("Vector3[]")) { return "Vector3[]"; } else if (type.Contains("int")) { return "int"; } else if (type.Contains("long")) { return "long"; } else if (type.Contains("float")) { return "float"; } else if (type.Contains("string")) { return "string"; } else if (type.Contains("Vector3")) { return "Vector3"; } else if (type.Contains("bool")) { return "bool"; } // else if (type.Contains("Int2")) // { // return StringUtility.Contact("public Int2 ", field.Trim(), ";"); // } // else if (type.Contains("Int3")) // { // return StringUtility.Contact("public Int3 ", field.Trim(), ";"); // } else { return string.Empty; } } public static string GetField(string type, string field) { field = field.Replace(" ", ""); if (type.Contains("int[][]")) { return StringUtility.Contact("public int[][] ", field.Trim(), ";"); } else if (type.Contains("Dictionary")) { return StringUtility.Contact("public Dictionary ", field.Trim(), ";"); } else if (type.Contains("Dictionary")) { return StringUtility.Contact("public Dictionary ", field.Trim(), ";"); } else if (type.Contains("float[][]")) { return StringUtility.Contact("public float[][] ", field.Trim(), ";"); } else if (type.Contains("int[]")) { return StringUtility.Contact("public int[] ", field.Trim(), ";"); } else if (type.Contains("Int2[]")) { return StringUtility.Contact("public Int2[] ", field.Trim(), ";"); } else if (type.Contains("Int3[]")) { return StringUtility.Contact("public Int3[] ", field.Trim(), ";"); } else if (type.Contains("float[]")) { return StringUtility.Contact("public float[] ", field.Trim(), ";"); } else if (type.Contains("string[]")) { return StringUtility.Contact("public string[] ", field.Trim(), ";"); } else if (type.Contains("Vector3[]")) { return StringUtility.Contact("public Vector3[] ", field.Trim(), ";"); } else if (type.Contains("int")) { return StringUtility.Contact("public int ", field.Trim(), ";"); } else if (type.Contains("long")) { return StringUtility.Contact("public long ", field.Trim(), ";"); } else if (type.Contains("float")) { return StringUtility.Contact("public float ", field.Trim(), ";"); } else if (type.Contains("string")) { return StringUtility.Contact("public string ", field, ";"); } else if (type.Contains("Vector3")) { return StringUtility.Contact("public Vector3 ", field.Trim(), ";"); } else if (type.Contains("bool")) { return StringUtility.Contact("public bool ", field.Trim(), ";"); } else if (type.Contains("Int2")) { return StringUtility.Contact("public Int2 ", field.Trim(), ";"); } else if (type.Contains("Int3")) { return StringUtility.Contact("public Int3 ", field.Trim(), ";"); } else { return string.Empty; } } public static string GetRead(string type, string field, int index) { field = field.Replace(" ", ""); if (type.Contains("int[][]")) { return StringUtility.Contact(field, " = JsonMapper.ToObject(tables", "[", index, "].Replace(\"(\", \"[\").Replace(\")\", \"]\")); "); } else if (type.Contains("Dictionary")) { return StringUtility.Contact(field, " = ConfigParse.ParseIntDict(tables", "[", index, "]); "); } else if (type.Contains("Dictionary")) { return StringUtility.Contact(field, " = ConfigParse.ParseIntArrayDict(tables", "[", index, "]); "); } else if (type.Contains("float[][]")) { return StringUtility.Contact(field, " = JsonMapper.ToObject(tables", "[", index, "].Replace(\"(\", \"[\").Replace(\")\", \"]\")); "); } else if (type.Contains("int[]")) { var line0 = StringUtility.Contact("if (tables", "[", index, "].Contains(\"[\"))\n"); var line0_1 = StringUtility.Contact(retract3, "{\n"); var line0_2 = StringUtility.Contact(retract4, field, " = JsonMapper.ToObject(tables", "[", index, "]);\n"); var line0_3 = StringUtility.Contact(retract3, "}\n"); var line0_4 = StringUtility.Contact(retract3, "else\n"); var line0_5 = StringUtility.Contact(retract3, "{\n"); var line1 = StringUtility.Contact(retract4, "string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n"); var line2 = StringUtility.Contact(retract4, field, " = ", "new int", "[", field, "StringArray.Length]", ";", "\n"); var line3 = StringUtility.Contact(retract4, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n"); var line4 = StringUtility.Contact(retract4, "{\n"); var line5 = StringUtility.Contact(retract5, " int.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n"); var line6 = StringUtility.Contact(retract4, "}\n"); var line0_6 = StringUtility.Contact(retract3, "}"); return StringUtility.Contact(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6); } else if (type.Contains("Int2[]")) { var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n"); var line2 = StringUtility.Contact(retract3, field, " = ", "new Int2", "[", field, "StringArray.Length]", ";", "\n"); var line3 = StringUtility.Contact(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n"); var line4 = StringUtility.Contact(retract3, "{\n"); var line5 = StringUtility.Contact(retract4, " Int2.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n"); var line6 = StringUtility.Contact(retract3, "}"); return StringUtility.Contact(line1, line2, line3, line4, line5, line6); } else if (type.Contains("Int3[]")) { var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n"); var line2 = StringUtility.Contact(retract3, field, " = ", "new Int3", "[", field, "StringArray.Length]", ";", "\n"); var line3 = StringUtility.Contact(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n"); var line4 = StringUtility.Contact(retract3, "{\n"); var line5 = StringUtility.Contact(retract4, " Int3.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n"); var line6 = StringUtility.Contact(retract3, "}"); return StringUtility.Contact(line1, line2, line3, line4, line5, line6); } else if (type.Contains("float[]")) { var line0 = StringUtility.Contact("if (tables", "[", index, "].Contains(\"[\"))\n"); var line0_1 = StringUtility.Contact(retract3, "{\n"); var line0_2 = StringUtility.Contact(retract4, field, " = JsonMapper.ToObject(tables", "[", index, "]);\n"); var line0_3 = StringUtility.Contact(retract3, "}\n"); var line0_4 = StringUtility.Contact(retract3, "else\n"); var line0_5 = StringUtility.Contact(retract3, "{\n"); var line1 = StringUtility.Contact(retract4, "string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n"); var line2 = StringUtility.Contact(retract4, field, " = ", "new float", "[", field, "StringArray.Length", "]", ";", "\n"); var line3 = StringUtility.Contact(retract4, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n"); var line4 = StringUtility.Contact(retract4, "{\n"); var line5 = StringUtility.Contact(retract5, " float.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n"); var line6 = StringUtility.Contact(retract4, "}\n"); var line0_6 = StringUtility.Contact(retract3, "}"); return StringUtility.Contact(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6); } else if (type.Contains("string[]")) { var line1 = StringUtility.Contact(field, " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);"); return line1; } else if (type.Contains("Vector3[]")) { var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n"); var line2 = StringUtility.Contact(retract3, field, " = ", "new Vector3", "[", field, "StringArray.Length", "]", ";", "\n"); var line3 = StringUtility.Contact(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n"); var line4 = StringUtility.Contact(retract3, "{\n"); var line5 = StringUtility.Contact(retract4, field, "[i]", "=", field, "StringArray", "[i]", ".Vector3Parse()", ";", "\n"); var line6 = StringUtility.Contact(retract3, "}"); return StringUtility.Contact(line1, line2, line3, line4, line5, line6); } else if (type.Contains("int")) { return StringUtility.Contact("int.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; "); } else if (type.Contains("long")) { return StringUtility.Contact("long.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; "); } else if (type.Contains("float")) { return StringUtility.Contact("float.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; "); } else if (type.Contains("string")) { return StringUtility.Contact(field, " = ", "tables", "[", index, "]", ";"); } else if (type.Contains("Vector3")) { return StringUtility.Contact(field, "=", "tables", "[", index, "]", ".Vector3Parse()", ";"); } else if (type.Contains("bool")) { var line1 = StringUtility.Contact("var ", field, "Temp", " = 0", ";", "\n"); var line2 = StringUtility.Contact(retract3, "int.TryParse(tables", "[", index, "]", ",", "out ", field, "Temp", ")", "; ", "\n"); var line3 = StringUtility.Contact(retract3, field, "=", field, "Temp", "!=0", ";"); return StringUtility.Contact(line1, line2, line3); } else if (type.Contains("Int2")) { return StringUtility.Contact("Int2.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; "); } else if (type.Contains("Int3")) { return StringUtility.Contact("Int3.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; "); } else { return string.Empty; } } static string configClassPath = "Assets/Scripts/Main/Config/Configs"; static string templatePath = "Assets/Editor/ConfigGen/ConfigDataTemplate.txt"; public static void CreatNewConfigClass(string _name, string _idType) { string newConfigPath = configClassPath + string.Format("/{0}Config.cs", _name); AssetDatabase.DeleteAsset(newConfigPath); UnityEngine.Object o = CreateScriptAssetFromTemplate(newConfigPath, templatePath, _idType); ProjectWindowUtil.ShowCreatedAsset(o); } internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile, string _idType) { string fullPath = Path.GetFullPath(pathName); StreamReader streamReader = new StreamReader(resourceFile); string text = streamReader.ReadToEnd(); streamReader.Close(); string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName); text = Regex.Replace(text, "#ClassName*#", fileNameWithoutExtension); text = Regex.Replace(text, "#DateTime#", System.DateTime.Now.ToLongDateString()); text = Regex.Replace(text, "#Field#", CreateConfigClassFile.filedContent); text = Regex.Replace(text, "#Read#", CreateConfigClassFile.readContent); text = Regex.Replace(text, "#FileName#", fileNameWithoutExtension.Substring(0, fileNameWithoutExtension.Length - 6)); text = Regex.Replace(text, "#KEY#", _idType); bool encoderShouldEmitUTF8Identifier = true; bool throwOnInvalidBytes = false; UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes); bool append = false; StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding); streamWriter.Write(text); streamWriter.Close(); AssetDatabase.ImportAsset(pathName); return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object)); } internal static void AddConfigInit(string pathName) { string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName); string add1 = string.Format("{0}.Init();taskCount++;", fileNameWithoutExtension); string add2 = string.Format("completeCount += {0}.inited ? 1 : 0;", fileNameWithoutExtension); string path = Application.dataPath + "/Scripts/Utility/ConfigInitiator.cs"; var text = File.ReadAllText(path); if (!text.Contains(add1)) { text = text.Replace("//初始化结束\r\n", add1 + "\r\n" + "\t\t//初始化结束\r\n"); } else { Debug.Log(fileNameWithoutExtension); } if (!text.Contains(add2)) { text = text.Replace("//统计配置表解析进度\r\n", add2 + "\r\n" + "\t\t//统计配置表解析进度\r\n"); } bool encoderShouldEmitUTF8Identifier = true; bool throwOnInvalidBytes = false; UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes); bool append = false; StreamWriter streamWriter = new StreamWriter(path, append, encoding); streamWriter.Write(text); streamWriter.Close(); AssetDatabase.ImportAsset(path); } }