少年修仙传客户端基础资源
lwb
2020-11-20 523a8c5b8de799aeaeaa7287f0b4f9e2edf339ee
Assets/Editor/Tool/CreateLuaClassFile.cs
@@ -8,7 +8,7 @@
using System.Text;
using System.Text.RegularExpressions;
public class CreateLuaClassFile
public class CreateLuaWindowClassFile
{
    static string templatePath = "Assets/Editor/ScriptTemplate/LuaWindowTemplate.txt";
@@ -68,4 +68,194 @@
        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<LuaBehaviourTemplate>(), 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<LuaConfigTemplate>(), 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<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 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));
    }
}