| 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;  | 
|   | 
|   | 
|     [UnityEditor.MenuItem("Assets/生成配置解析类型")]  | 
|     public static void GenerateConfigClass()  | 
|     {  | 
|   | 
|         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));  | 
|                 }  | 
|             }  | 
|   | 
|             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<string>();  | 
|             var readFulls = new List<string>();  | 
|   | 
|             int index = 0;  | 
|             for (int j = 0; j < min; j++)  | 
|             {  | 
|                 var type = types[j];  | 
|                 var field = fields[j];  | 
|                 var fieldstring = GetField(type, field);  | 
|                 var readString = GetRead(type, field, index);  | 
|                 if (!string.IsNullOrEmpty(fieldstring))  | 
|                 {  | 
|                     fieldFulls.Add(fieldstring);  | 
|                 }  | 
|   | 
|                 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('.')), isIL);  | 
|         }  | 
|   | 
|     }  | 
|   | 
|     public static string GetField(string type, string field)  | 
|     {  | 
|         field = field.Replace(" ", "");  | 
|         if (type.Contains("int[][]"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly int[][] ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("int[]"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly int[] ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("Int2[]"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly Int2[] ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("Int3[]"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly Int3[] ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("float[]"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly float[] ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("string[]"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly string[] ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("Vector3[]"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly Vector3[] ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("int"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly int ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("long"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly long ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("float"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly float ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("string"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly string ", field, ";");  | 
|         }  | 
|         else if (type.Contains("Vector3"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly Vector3 ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("bool"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly bool ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("Int2"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly Int2 ", field.Trim(), ";");  | 
|         }  | 
|         else if (type.Contains("Int3"))  | 
|         {  | 
|             return StringUtility.Contact("public readonly 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<int[][]>(tables", "[", index, "]", ")", "; ");  | 
|         }  | 
|         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<int[]>(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 line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");  | 
|             var line2 = StringUtility.Contact(retract3, field, " = ", "new float", "[", 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, " float.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("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/Core/GameEngine/Model/Config";  | 
|     static string configILClassPath = "LogicProject/Src/Config";  | 
|     static string templatePath = "Assets/Editor/ScriptTemplate/ConfigDataTemplate.txt";  | 
|   | 
|     public static void CreatNewConfigClass(string _name, bool isIL)  | 
|     {  | 
|         string newConfigPath;  | 
|         if (isIL)  | 
|         {  | 
|             newConfigPath = configILClassPath + string.Format("/IL{0}Config.cs", _name);  | 
|         }  | 
|         else  | 
|         {   | 
|             newConfigPath = configClassPath + string.Format("/{0}Config.cs", _name);  | 
|         }   | 
|         AssetDatabase.DeleteAsset(newConfigPath);  | 
|         UnityEngine.Object o = CreateScriptAssetFromTemplate(newConfigPath, templatePath, isIL);  | 
|         ProjectWindowUtil.ShowCreatedAsset(o);  | 
|     }  | 
|   | 
|     internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile, bool isIL)  | 
|     {  | 
|         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);  | 
|         if (isIL)  | 
|         {  | 
|             text = Regex.Replace(text, "#FileName#", fileNameWithoutExtension.Substring(2, fileNameWithoutExtension.Length - 8));  | 
|         }  | 
|         else  | 
|         {   | 
|             text = Regex.Replace(text, "#FileName#", fileNameWithoutExtension.Substring(0, fileNameWithoutExtension.Length - 6));  | 
|         }  | 
|   | 
|         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);  | 
|   | 
|     }  | 
| }  | 
|   | 
|   |