prefabTolua

 解决unity工程创建模版lua脚本的问题。

using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;

public class AnalyzePrefab {
    [MenuItem("Assets/prefab to lua scripts", false, 9)]
    private static void Analyze() {
        Object obj = Selection.activeObject;
        string prefabPath = AssetDatabase.GetAssetPath(obj);
        
        if (!prefabPath.Contains(".prefab"))
        {
            Debug.LogWarning("please select perfab!!!");
            return;
        }

        kvDic.Clear();
        flagPath.Clear();
        GameObject gobj = obj as GameObject;
        Transform tf = gobj.transform;
        GetChildren(tf);
        
        string kvstring = KVDicToString(kvDic);
        MyDoCreateScriptAsset.SetKVString(kvstring);
        string btnaddlistener = BtnAddListenerString();
        MyDoCreateScriptAsset.SetBtnAddListenerString(btnaddlistener);
        string btnlistener = BtnListenerString();
        MyDoCreateScriptAsset.SetBtnListenerString(btnlistener);

        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
        ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
        GetSelectedPathOrFallback() + "/Template.lua",
        null,
       "Assets/Editor/PrefabToLua/Template/lua.lua");

        Debug.Log("prefab to lua scripts fnish!!");
    }

    public static string GetSelectedPathOrFallback()
    {
        string path = "Assets";
        foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets))
        {
            path = AssetDatabase.GetAssetPath(obj);
            if (!string.IsNullOrEmpty(path) && File.Exists(path))
            {
                path = Path.GetDirectoryName(path);
                break;
            }
        }
        return path;
    }

    static string prefix = "m_";
    static Dictionary<string, string> kvComponent = new Dictionary<string, string>() {
        {"btn",   "T_UnityButton"},
        {"txt",   "T_UnityText"},
        {"tf",    "T_UnityTransform"},
        {"rtf",   "T_UnityRectTransform"},
        {"img",   "T_UnityImage"},
        {"tog",   "T_UnityToggle"},
        {"ani",   "T_UnityAnimator"},
        {"spr",   "T_UnitySprite"},
        {"rimg",  "T_UnityRawImage"},
        {"obj",   "T_UnityGameObject"},
    };
    static Dictionary<string, List<string>> kvDic = new Dictionary<string, List<string>>();
    static List<string> flagPath = new List<string>();

    //查找组件路径
    static void GetChildren(Transform tf)
    {
        int count = tf.childCount;
        if (count <= 0)
            return;

        if (flagPath.Count <= 1)
            flagPath.Add(tf.name);
        else
            flagPath.Add("/" + tf.name);

        foreach (var item in kvComponent)
        {
            if (tf.name.StartsWith(item.Key))                 
            {
                var allItem = new List<string>(flagPath);
                allItem.RemoveAt(0);                            //掐头
                string name = prefix + tf.name;
                string key = GetKey(name);
                kvDic.Add(key, allItem);
            }
        }
        for (int i = 0; i < count; i++)                         //subset
        {
            GetChildren(tf.GetChild(i));
        }

        flagPath.RemoveAt(flagPath.Count - 1);                  //去尾
    }

    //获取唯一key
    static string GetKey(string name)
    {
        name = name + 1;
        if (kvDic.ContainsKey(name))
        {
            return GetKey(name);
        }
        return name;
    }

    //组件路径转字符串
    static string KVDicToString(Dictionary<string, List<string>> kvdic)
    {
        string result = "";
        foreach (var item in kvdic)
        {
            var value = item.Value;
            string resultV = "";
            foreach (var itemV in value)
            {
                resultV = resultV + itemV;
            }
            result = result + GetSuffix(item.Key, resultV);
        }
        return result;
    }

    static string GetSuffix(string key,string value)
    {
        string result = "";
        foreach (var item in kvComponent)
        {
            if (key.StartsWith(prefix + item.Key))
            {
                result = string.Format("self.{0} = self:GetComponent(\'{1}\',{2}) \n \t", key, value, item.Value);
                break;
            }
        }
        
        return result;
    }

    static string BtnAddListenerString()
    {
        string result = "";
        foreach (var item in kvDic)
        {
            if (item.Key.StartsWith("m_btn"))
                result = result + string.Format("UiUtils.ApplyCommonClickListener(self.{0}, handler(self, self.On{1}Click)) \n \t", item.Key, item.Key);
        }
        return result;
    }

    static string BtnListenerString()
    {
        string result = "";
        foreach (var item in kvDic)
        {
            if (item.Key.StartsWith("m_btn"))
                result = result + string.Format("function #NAME#:On{0}Click() \n \t \nend\n\n", item.Key);
        }
        return result;
    }
}

class MyDoCreateScriptAsset : EndNameEditAction
{
    public override void Action(int instanceId, string pathName, string resourceFile)
    {
        Object o = CreateScriptAssetFromTemplate(pathName, resourceFile);
        ProjectWindowUtil.ShowCreatedAsset(o);
    }

    internal static 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, "#DATETIME#", System.DateTime.Now.ToString());
        text = Regex.Replace(text, "#KV#", kvstring);
        text = Regex.Replace(text, "#BTNADDLISTENER#", btnaddstring);
        text = Regex.Replace(text, "#BTNLISTENER#", btnlistenerstring);
        text = Regex.Replace(text, "#NAME#", fileNameWithoutExtension); 

        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));
    }

    static string kvstring = "";
    public static void SetKVString(string kvString)
    {
        kvstring = kvString;
    }

    static string btnaddstring = "";
    public static void SetBtnAddListenerString(string btnaddString)
    {
        btnaddstring = btnaddString;
    }

    static string btnlistenerstring = "";
    public static void SetBtnListenerString(string btnString)
    {
        btnlistenerstring = btnString;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值