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 CreateLuaWindowClassFile { static string templatePath = "Assets/Editor/ScriptTemplate/LuaWindowTemplate.txt"; [MenuItem("Assets/Create/Lua/LuaWindow", false, 4)] public static void CreateLuaClass() { var path = GetSelectedPathOrFallback() + "/NewLuaWindow.lua"; AssetDatabase.DeleteAsset(path); ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance(), path, null, templatePath); } public static string GetSelectedPathOrFallback() { string path = "Assets"; foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets)) { path = AssetDatabase.GetAssetPath(obj); if (!string.IsNullOrEmpty(path) && File.Exists(path)) { path = Path.GetDirectoryName(path); break; } } return path; } } class LuaWindowTemplate : EndNameEditAction { public override void Action(int instanceId, string pathName, string resourceFile) { UnityEngine.Object o = CreateScriptAssetFromTemplate(pathName, resourceFile); ProjectWindowUtil.ShowCreatedAsset(o); } 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(); var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName); text = Regex.Replace(text, "#ClassName#", fileNameWithoutExtension); text = Regex.Replace(text, "#DateTime#", System.DateTime.Now.ToLongDateString()); 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)); } } public class CreateLuaBehaviourClassFile { static string templatePath = "Assets/Editor/ScriptTemplate/LuaBehaviourTemplate.txt"; [MenuItem("Assets/Create/Lua/LuaBehaviour", false, 4)] public static void CreateLuaClass() { var path = GetSelectedPathOrFallback() + "/NewBehaviour.lua"; AssetDatabase.DeleteAsset(path); ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance(), path, null, templatePath); } public static string GetSelectedPathOrFallback() { string path = "Assets"; foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets)) { path = AssetDatabase.GetAssetPath(obj); if (!string.IsNullOrEmpty(path) && File.Exists(path)) { path = Path.GetDirectoryName(path); break; } } return path; } } class LuaBehaviourTemplate : EndNameEditAction { public override void Action(int instanceId, string pathName, string resourceFile) { UnityEngine.Object o = CreateScriptAssetFromTemplate(pathName, resourceFile); ProjectWindowUtil.ShowCreatedAsset(o); } 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(); var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName); text = Regex.Replace(text, "#ClassName#", fileNameWithoutExtension); text = Regex.Replace(text, "#DateTime#", System.DateTime.Now.ToLongDateString()); 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)); } } public class CreateLuaConfigClassFile { static string templatePath = "Assets/Editor/ScriptTemplate/LuaConfigTemplate.txt"; public static string readContent = string.Empty; [MenuItem("Assets/生成Lua配置解析类型")] public static void CreateLuaClass() { if (Selection.objects != null) { foreach (var item in Selection.objects) { var name = item.name; MakeReadContent(Application.dataPath.Replace("Assets", "") + AssetDatabase.GetAssetPath(item)); var path = string.Format("Assets/ResourcesOut/Lua/config/{0}Config.lua", name); AssetDatabase.DeleteAsset(path); ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance(), path, null, templatePath); } } } public static void MakeReadContent(string path) { var fileInfo = new FileInfo(path); 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(); int index = 0; for (int j = 0; j < min; j++) { var type = types[j]; var field = fields[j]; var readString = GetRead(type, field, index + 1); if (!string.IsNullOrEmpty(readString)) { index++; readFulls.Add(readString); } } readContent = string.Join("\r\n\t\t", readFulls.ToArray()); } } static string GetRead(string _type, string _field, int _index) { _field = _field.Replace(" ", ""); if (_type.Contains("int[]") || _type.Contains("float[]")) { return string.Format("subTable.{0} = stringArray_to_numberArray(Split(contents[{1}], '|'))", _field, _index); } else if (_type.Contains("Int2[]")) { return string.Format("subTable.{0} = stringArray_to_Int2Array(Split(contents[{1}], '|'))", _field, _index); } else if (_type.Contains("string[]")) { return string.Format("subTable.{0} = Split(contents[{1}], '|')", _field, _index); } else if (_type.Contains("Int2")) { return string.Format("subTable.{0} = toInt2(Split(contents[{1}], '|'))", _field, _index); } else if (_type.Contains("int") || _type.Contains("float")) { return string.Format("subTable.{0} = tonumber(contents[{1}])", _field, _index); } else if (_type.Contains("string")) { return string.Format("subTable.{0} = contents[{1}]", _field, _index); } else { return string.Empty; } } } class LuaConfigTemplate : EndNameEditAction { public override void Action(int instanceId, string pathName, string resourceFile) { UnityEngine.Object o = CreateScriptAssetFromTemplate(pathName, resourceFile); ProjectWindowUtil.ShowCreatedAsset(o); } 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(); var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName); text = Regex.Replace(text, "#ClassName#", fileNameWithoutExtension.Substring(0, fileNameWithoutExtension.Length - 6)); text = Regex.Replace(text, "#DateTime#", System.DateTime.Now.ToLongDateString()); text = Regex.Replace(text, "#Read#", CreateLuaConfigClassFile.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)); } }