From ff7f4155ae99f589691b929f959caf5f284cfe12 Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期三, 13 二月 2019 15:43:48 +0800
Subject: [PATCH] 3335 配置表读取重构。

---
 Assets/Editor/Tool/ConfigClassGenerate.cs |  246 +++++++++++++++++++++++++++++++++++-------------
 1 files changed, 178 insertions(+), 68 deletions(-)

diff --git a/Assets/Editor/Tool/ConfigClassGenerate.cs b/Assets/Editor/Tool/ConfigClassGenerate.cs
index 8147b68..82242e0 100644
--- a/Assets/Editor/Tool/ConfigClassGenerate.cs
+++ b/Assets/Editor/Tool/ConfigClassGenerate.cs
@@ -3,24 +3,49 @@
 using UnityEditor.ProjectWindowCallback;
 using UnityEngine;
 using UnityEditor;
-using System;
 using System.IO;
 using System.Text;
 using System.Text.RegularExpressions;
+using System;
+using UnityEngine.Events;
 
-public class CreateConfigData
+public class CreateConfigClassFile
 {
 
-    public static event Action fileCreateEvent;
+    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 string primaryKey = string.Empty;
+    public static event UnityAction FileCreateEvent;
+
     public static string filedContent = string.Empty;
     public static string readContent = string.Empty;
+
+
+    [UnityEditor.MenuItem("Assets/鐢熸垚閰嶇疆瑙f瀽绫诲瀷")]
+    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)
     {
         var lines = File.ReadAllLines(fileInfo.FullName);
-
         if (lines.Length > 2)
         {
             var typeLine = lines[0];
@@ -30,7 +55,6 @@
             var min = Mathf.Min(types.Length, fields.Length);
             var fieldFulls = new List<string>();
             var readFulls = new List<string>();
-            primaryKey = fields[0];
 
             int index = 0;
             for (int j = 0; j < min; j++)
@@ -51,51 +75,71 @@
                 }
             }
 
-            filedContent = string.Join("\r\n\t\t", fieldFulls.ToArray());
-            readContent = string.Join("\r\n\t\t\t\r\n\t\t\t\t", readFulls.ToArray());
+            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('.')));
         }
 
     }
 
-    public static string GetField(string _type, string _field)
+    public static string GetField(string type, string field)
     {
-        _field = _field.Replace(" ", "");
-        if (_type.Contains("int[]"))
+        field = field.Replace(" ", "");
+        if (type.Contains("int[]"))
         {
-            return StringUtility.Contact("public int[] ", _field.Trim(), ";");
+            return StringUtility.Contact("public readonly int[] ", field.Trim(), ";");
         }
-        else if (_type.Contains("float[]"))
+        else if (type.Contains("Int2[]"))
         {
-            return StringUtility.Contact("public float[] ", _field.Trim(), ";");
+            return StringUtility.Contact("public readonly Int2[] ", field.Trim(), ";");
         }
-        else if (_type.Contains("string[]"))
+        else if (type.Contains("Int3[]"))
         {
-            return StringUtility.Contact("public string[] ", _field.Trim(), ";");
+            return StringUtility.Contact("public readonly Int3[] ", field.Trim(), ";");
         }
-        else if (_type.Contains("Vector3[]"))
+        else if (type.Contains("float[]"))
         {
-            return StringUtility.Contact("public Vector3[] ", _field.Trim(), ";");
+            return StringUtility.Contact("public readonly float[] ", field.Trim(), ";");
         }
-        else if (_type.Contains("int"))
+        else if (type.Contains("string[]"))
         {
-            return StringUtility.Contact("public int ", _field.Trim(), ";");
+            return StringUtility.Contact("public readonly string[] ", field.Trim(), ";");
         }
-        else if (_type.Contains("long"))
+        else if (type.Contains("Vector3[]"))
         {
-            return StringUtility.Contact("public long ", _field.Trim(), ";");
+            return StringUtility.Contact("public readonly Vector3[] ", field.Trim(), ";");
         }
-        else if (_type.Contains("float"))
+        else if (type.Contains("int"))
         {
-            return StringUtility.Contact("public float ", _field.Trim(), ";");
+            return StringUtility.Contact("public readonly int ", field.Trim(), ";");
         }
-        else if (_type.Contains("string"))
+        else if (type.Contains("long"))
         {
-            return StringUtility.Contact("public string ", _field.Contains("[") ? _field.Substring(0, _field.IndexOf("[")) : _field, ";");
+            return StringUtility.Contact("public readonly long ", field.Trim(), ";");
         }
-        else if (_type.Contains("Vector3"))
+        else if (type.Contains("float"))
         {
-            return StringUtility.Contact("public Vector3 ", _field.Trim(), ";");
+            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
         {
@@ -103,70 +147,105 @@
         }
     }
 
-    public static string GetRead(string _type, string _field, int _index)
+    public static string GetRead(string type, string field, int index)
     {
-        _field = _field.Replace(" ", "");
-        if (_type.Contains("int[]"))
+        field = field.Replace(" ", "");
+        if (type.Contains("int[]"))
         {
-
-            var line1 = StringUtility.Contact("var ", _field, "StringArray", " = ", "contents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
-            var line2 = StringUtility.Contact("\t\t\t\t", _field, " = ", "new int", "[", _field, "StringArray.Length]", ";", "\n");
-            var line3 = StringUtility.Contact("\t\t\t\t", "for (int i=0;i<", _field, "StringArray", ".Length", ";", "i++", ")", "\n");
-            var line4 = "\t\t\t\t{\n";
-            var line5 = StringUtility.Contact("\t\t\t\t\t", " int.TryParse(", _field, "StringArray", "[i]", ",", "out ", _field, "[i]", ")", ";", "\n");
-            var line6 = "\t\t\t\t}";
+            var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
+            var line2 = StringUtility.Contact(retract3, field, " = ", "new int", "[", 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, " int.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[]"))
+        else if (type.Contains("Int2[]"))
         {
-            var line1 = StringUtility.Contact("var ", _field, "StringArray", " = ", "contents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
-            var line2 = StringUtility.Contact("\t\t\t\t", _field, " = ", "new float", "[", _field, "StringArray.Length", "]", ";", "\n");
-            var line3 = StringUtility.Contact("\t\t\t\t", "for (int i=0;i<", _field, "StringArray", ".Length", ";", "i++", ")", "\n");
-            var line4 = "\t\t\t\t{\n";
-            var line5 = StringUtility.Contact("\t\t\t\t\t", " float.TryParse(", _field, "StringArray", "[i]", ",", "out ", _field, "[i]", ")", ";", "\n");
-            var line6 = "\t\t\t\t}";
+            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("string[]"))
+        else if (type.Contains("Int3[]"))
         {
-            var line1 = StringUtility.Contact(_field, " = ", "contents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);");
+            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[]"))
+        else if (type.Contains("Vector3[]"))
         {
-            var line1 = StringUtility.Contact("var ", _field, "StringArray", " = ", "contents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
-            var line2 = StringUtility.Contact("\t\t\t\t", _field, " = ", "new Vector3", "[", _field, "StringArray.Length", "]", ";", "\n");
-            var line3 = StringUtility.Contact("\t\t\t\t", "for (int i=0;i<", _field, "StringArray", ".Length", ";", "i++", ")", "\n");
-            var line4 = "\t\t\t\t{\n";
-            var line5 = StringUtility.Contact("\t\t\t\t\t", _field, "[i]", "=", _field, "StringArray", "[i]", ".Vector3Parse()", ";", "\n");
-            var line6 = "\t\t\t\t}";
+            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"))
+        else if (type.Contains("int"))
         {
-            return string.Format("int.TryParse(contents[{0}],out {1});", _index, _field);
+            return StringUtility.Contact("int.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
         }
-        else if (_type.Contains("float"))
+        else if (type.Contains("float"))
         {
-            return string.Format("float.TryParse(contents[{0}],out {1});", _index, _field);
+            return StringUtility.Contact("float.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
         }
-        else if (_type.Contains("string"))
+        else if (type.Contains("string"))
         {
-            return string.Format("{0} = contents[{1}].Trim();", _field.Contains("[") ? _field.Substring(0, _field.IndexOf("[")) : _field, _index);
+            return StringUtility.Contact(field, " = ", "tables", "[", index, "]", ";");
         }
-        else if (_type.Contains("Vector3"))
+        else if (type.Contains("Vector3"))
         {
-            return StringUtility.Contact(_field, "=", "contents", "[", _index, "]", ".Vector3Parse()", ";");
+            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 templatePath = "Assets/Editor/ScriptTemplate/ConfigDataTemplate.txt";
@@ -176,11 +255,12 @@
         var newConfigPath = configClassPath + string.Format("/{0}Config.cs", _name);
         AssetDatabase.DeleteAsset(newConfigPath);
         UnityEngine.Object o = CreateScriptAssetFromTemplate(newConfigPath, templatePath);
+        AddConfigInit(newConfigPath);
         ProjectWindowUtil.ShowCreatedAsset(o);
 
-        if (CreateConfigData.fileCreateEvent != null)
+        if (FileCreateEvent != null)
         {
-            CreateConfigData.fileCreateEvent();
+            FileCreateEvent();
         }
     }
 
@@ -194,9 +274,9 @@
         string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);
         text = Regex.Replace(text, "#ClassName*#", fileNameWithoutExtension);
         text = Regex.Replace(text, "#DateTime#", System.DateTime.Now.ToLongDateString());
-        text = Regex.Replace(text, "#PrimaryKey#", CreateConfigData.primaryKey);
-        text = Regex.Replace(text, "#Field#", CreateConfigData.filedContent);
-        text = Regex.Replace(text, "#Read#", CreateConfigData.readContent);
+        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));
 
         bool encoderShouldEmitUTF8Identifier = true;
         bool throwOnInvalidBytes = false;
@@ -208,6 +288,36 @@
         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();{1}", fileNameWithoutExtension, "\r\n\t\ttaskCount++;");
+        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");
+        }
+
+        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);
+
+    }
 }
 
 

--
Gitblit v1.8.0