using System.Collections; using System.Collections.Generic; using UnityEditor.ProjectWindowCallback; using UnityEngine; using UnityEditor; using System; using System.IO; using System.Text; using System.Text.RegularExpressions; public class CreateConfigData { public static event Action fileCreateEvent; public static string primaryKey = string.Empty; public static string filedContent = string.Empty; public static string readContent = string.Empty; public static void CreateConfigClass(FileInfo fileInfo) { //filedContent = string.Empty; //var obj = _obj; //var name = obj.name; //var assetPath = AssetDatabase.GetAssetPath(obj.GetInstanceID()); //var fullName = StringUtility.Contact(Directory.GetParent(Application.dataPath), "/", assetPath); 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(); primaryKey = fields[0]; 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\t", fieldFulls.ToArray()); readContent = string.Join("\r\n\t\t\t\r\n\t\t\t\t", readFulls.ToArray()); CreatNewConfigClass(fileInfo.Name.Substring(0, fileInfo.Name.IndexOf('.'))); } } 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("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(), " { get ; private set ; }"); } else if(_type.Contains("long")) { return StringUtility.Contact("public long ", _field.Trim(), " { get ; private set ; }"); } else if (_type.Contains("float")) { return StringUtility.Contact("public float ", _field.Trim(), " { get ; private set; } "); } else if (_type.Contains("string")) { return StringUtility.Contact("public string ", _field.Contains("[")? _field.Substring(0, _field.IndexOf("[")): _field, " { get ; private set; } "); } else if (_type.Contains("Vector3")) { return StringUtility.Contact("public Vector3 ", _field.Trim(), " { get ; private set; } "); } 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", " = ", "rawContents", "[", _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}"; return StringUtility.Contact(line1, line2, line3, line4, line5, line6); } else if (_type.Contains("float[]")) { var line1 = StringUtility.Contact("string[] ", _field, "StringArray", " = ", "rawContents", "[", _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}"; return StringUtility.Contact(line1, line2, line3, line4, line5, line6); } else if (_type.Contains("string[]")) { var line1 = StringUtility.Contact(_field, " = ", "rawContents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);"); return line1; } else if (_type.Contains("Vector3[]")) { var line1 = StringUtility.Contact("string[] ", _field, "StringArray", " = ", "rawContents", "[", _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}"; return StringUtility.Contact(line1, line2, line3, line4, line5, line6); } else if (_type.Contains("int")) { return StringUtility.Contact(_field, "=IsNumeric(rawContents[", _index, "]) ? ", "int.Parse(rawContents", "[", _index, "]", "):0", "; "); } else if (_type.Contains("float")) { return StringUtility.Contact(_field, "=IsNumeric(rawContents[", _index, "]) ? ", "float.Parse(rawContents", "[", _index, "]", "):0", "; "); } else if (_type.Contains("string")) { return StringUtility.Contact(_field.Contains("[") ? _field.Substring(0, _field.IndexOf("[")) : _field, " = ", "rawContents", "[", _index, "]", ".Trim()", ";"); } else if (_type.Contains("Vector3")) { return StringUtility.Contact(_field, "=", "rawContents", "[", _index, "]", ".Vector3Parse()", ";"); } else { return string.Empty; } } static string configClassPath = "Assets" + "/" + "Scripts/Core/GameEngine/Model/Config"; static string templatePath = "Assets/Editor/ScriptTemplate/ConfigDataTemplate.txt"; public static void CreatNewConfigClass(string _name) { var newConfigPath = configClassPath + string.Format("/{0}Config.cs", _name); AssetDatabase.DeleteAsset(newConfigPath); UnityEngine.Object o = CreateScriptAssetFromTemplate(newConfigPath, templatePath); ProjectWindowUtil.ShowCreatedAsset(o); if (CreateConfigData.fileCreateEvent != null) { CreateConfigData.fileCreateEvent(); } } internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile) { 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, "#PrimaryKey#", CreateConfigData.primaryKey); text = Regex.Replace(text, "#Field#", CreateConfigData.filedContent); text = Regex.Replace(text, "#Read#", CreateConfigData.readContent); 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)); } }