少年修仙传客户端基础资源
hch
2023-10-24 57d8018b909bb87bf9af486b7008b7ca7b8157e7
0312 读表增加对数组和二维数组的解析
2个文件已修改
1096 ■■■■ 已修改文件
Assets/Editor/ScriptTemplate/ConfigDataTemplate.txt 399 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ConfigClassGenerate.cs 697 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ScriptTemplate/ConfigDataTemplate.txt
@@ -1,199 +1,200 @@
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           #DateTime#
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
public partial class #ClassName#
{
    #Field#
    public #ClassName#()
    {
    }
    public #ClassName#(string input)
    {
        try
        {
            var tables = input.Split('\t');
            #Read#
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, #ClassName#> configs = new Dictionary<string, #ClassName#>();
    public static #ClassName# Get(string id)
    {
        if (!inited)
        {
            Debug.Log("#ClassName# 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        #ClassName# config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new #ClassName#(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static #ClassName# Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<#ClassName#> GetValues()
    {
        var values = new List<#ClassName#>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        for (int i = 0; i < keys.Count; i++)
        {
            values.Add(Get(keys[i]));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/#FileName#.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/#FileName#.txt");
        }
        configs.Clear();
        var tempConfig = new #ClassName#();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new #ClassName#(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new #ClassName#(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           #DateTime#
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
using LitJson;
public partial class #ClassName#
{
    #Field#
    public #ClassName#()
    {
    }
    public #ClassName#(string input)
    {
        try
        {
            var tables = input.Split('\t');
            #Read#
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, #ClassName#> configs = new Dictionary<string, #ClassName#>();
    public static #ClassName# Get(string id)
    {
        if (!inited)
        {
            Debug.Log("#ClassName# 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        #ClassName# config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new #ClassName#(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static #ClassName# Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<#ClassName#> GetValues()
    {
        var values = new List<#ClassName#>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        for (int i = 0; i < keys.Count; i++)
        {
            values.Add(Get(keys[i]));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/#FileName#.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/#FileName#.txt");
        }
        configs.Clear();
        var tempConfig = new #ClassName#();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new #ClassName#(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new #ClassName#(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
Assets/Editor/Tool/ConfigClassGenerate.cs
@@ -1,341 +1,356 @@
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("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[]"))
        {
            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("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);
    }
}
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);
    }
}