解决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;
}
}