444 lines
16 KiB
C#
444 lines
16 KiB
C#
|
|
/****************************************************
|
|||
|
|
文件:FixPanelScript.cs
|
|||
|
|
作者:张铮
|
|||
|
|
邮箱:834207172@qq.com
|
|||
|
|
日期:2022/3/3 17:53:52
|
|||
|
|
功能:
|
|||
|
|
*****************************************************/
|
|||
|
|
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Text;
|
|||
|
|
|
|||
|
|
namespace Stary.Evo
|
|||
|
|
{
|
|||
|
|
namespace AssetEditor
|
|||
|
|
{
|
|||
|
|
public enum Mode
|
|||
|
|
{
|
|||
|
|
创建,
|
|||
|
|
以关键字更新,
|
|||
|
|
指定更新
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
enum RuleKey
|
|||
|
|
{
|
|||
|
|
Txt,
|
|||
|
|
Btn,
|
|||
|
|
Img
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class FixPanelScript : EditorWindow
|
|||
|
|
{
|
|||
|
|
static Dictionary<string, string> childrenNames; //对象子物体列表
|
|||
|
|
|
|||
|
|
static Dictionary<string, string> Rules = new Dictionary<string, string>()
|
|||
|
|
{
|
|||
|
|
{ "Txt", "Text" }, { "Btn", "Button" }, { "Img", "Image" }
|
|||
|
|
}; //命名规则
|
|||
|
|
|
|||
|
|
static Transform SelTran; //选择的对象
|
|||
|
|
static List<string> names; //重名的子物体
|
|||
|
|
static List<string> btnNames; //所有按钮
|
|||
|
|
TextAsset txt; //Fix选择的脚本
|
|||
|
|
private RuleKey ruleKey;
|
|||
|
|
string input; //Fix规则
|
|||
|
|
private Mode mode;
|
|||
|
|
static Dictionary<string, string> FixChilderNames; //fix新加的子物体
|
|||
|
|
static List<string> FixBtnNames; //fix新加的按钮
|
|||
|
|
|
|||
|
|
const string FixDef = "//FixStartDefiened";
|
|||
|
|
const string FixFind = "//FixStartFind";
|
|||
|
|
const string FixAddEvent = "//FixStartAddEvent";
|
|||
|
|
const string FixEvent = "//FixStartEvent";
|
|||
|
|
|
|||
|
|
private bool isHelp = false;
|
|||
|
|
|
|||
|
|
[MenuItem("Evo/Utility/获取子对象")]
|
|||
|
|
static void Fix()
|
|||
|
|
{
|
|||
|
|
FixPanelScript window =
|
|||
|
|
GetWindow<FixPanelScript>(true, "获取所有子对象");
|
|||
|
|
window.Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnEnable()
|
|||
|
|
{
|
|||
|
|
isHelp = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnGUI()
|
|||
|
|
{
|
|||
|
|
mode = (Mode)GUILayout.Toolbar((int)mode, Enum.GetNames(typeof(Mode)));
|
|||
|
|
switch (mode)
|
|||
|
|
{
|
|||
|
|
case Mode.创建:
|
|||
|
|
Create();
|
|||
|
|
break;
|
|||
|
|
case Mode.以关键字更新:
|
|||
|
|
FixKeyUpdate();
|
|||
|
|
break;
|
|||
|
|
case Mode.指定更新:
|
|||
|
|
FixNameUpdate();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Create()
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
SelTran = EditorGUILayout.ObjectField("父物体", SelTran, typeof(Transform), true) as Transform;
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
CreateButton("Create", CreateFile);
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void FixKeyUpdate()
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
txt = EditorGUILayout.ObjectField("脚本", txt, typeof(TextAsset), true) as TextAsset;
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
SelTran = EditorGUILayout.ObjectField("父物体", SelTran, typeof(Transform), true) as Transform;
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
ruleKey = (RuleKey)EditorGUILayout.EnumPopup("选择关键字进行更新", ruleKey);
|
|||
|
|
input = ruleKey.ToString();
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
CreateButton("FixKeyUpdate", FixScripts);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public void FixNameUpdate()
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
txt = EditorGUILayout.ObjectField("脚本", txt, typeof(TextAsset), true) as TextAsset;
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
SelTran = EditorGUILayout.ObjectField("父物体", SelTran, typeof(Transform), true) as Transform;
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
input = EditorGUILayout.TextField("输入名字指定更新", input);
|
|||
|
|
EditorGUILayout.Space(10);
|
|||
|
|
CreateButton("FixNameUpdate", FixScripts);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void CreateButton(string name, Action action)
|
|||
|
|
{
|
|||
|
|
GUI.color = Color.green;
|
|||
|
|
if (GUILayout.Button(name, GUILayout.MinWidth(200), GUILayout.MinHeight(50)))
|
|||
|
|
{
|
|||
|
|
isHelp = false;
|
|||
|
|
action?.Invoke();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GUI.color = Color.white;
|
|||
|
|
if (isHelp)
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.HelpBox("未筛选到物体", MessageType.Warning);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void FixScripts()
|
|||
|
|
{
|
|||
|
|
FixChilderNames = new Dictionary<string, string>();
|
|||
|
|
FixBtnNames = new List<string>();
|
|||
|
|
names = new List<string>();
|
|||
|
|
string path = AssetDatabase.GetAssetPath(txt); //获取选定脚本的路径
|
|||
|
|
Debug.Log(path);
|
|||
|
|
if (string.IsNullOrEmpty(input))
|
|||
|
|
{
|
|||
|
|
Debug.LogError("Error!!!");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GetChildren(SelTran, string.Empty, input);
|
|||
|
|
|
|||
|
|
StreamReader sr = new StreamReader(path, Encoding.UTF8);
|
|||
|
|
string msg = sr.ReadToEnd();
|
|||
|
|
FixDealScript(ref msg);
|
|||
|
|
sr.Close();
|
|||
|
|
StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8);
|
|||
|
|
sw.Write(msg);
|
|||
|
|
sw.Close();
|
|||
|
|
AssetDatabase.Refresh();
|
|||
|
|
Debug.Log("fix ok------");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void FixDealScript(ref string msg)
|
|||
|
|
{
|
|||
|
|
StringBuilder sbDef = new StringBuilder();
|
|||
|
|
Debug.Log(FixChilderNames.Count);
|
|||
|
|
foreach (KeyValuePair<string, string> item in FixChilderNames)
|
|||
|
|
{
|
|||
|
|
Debug.Log(item.Key);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var dic = FixChilderNames.GetEnumerator();
|
|||
|
|
while (dic.MoveNext())
|
|||
|
|
{
|
|||
|
|
string[] names = dic.Current.Key.Split('/');
|
|||
|
|
string name = names[names.Length - 1];
|
|||
|
|
string value = dic.Current.Value;
|
|||
|
|
if (!msg.Contains(name))
|
|||
|
|
{
|
|||
|
|
sbDef.AppendFormat("\tprivate {0} {1};", value, name);
|
|||
|
|
sbDef.AppendLine();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sbDef.AppendLine("\t" + FixDef);
|
|||
|
|
Debug.Log(sbDef.ToString());
|
|||
|
|
|
|||
|
|
|
|||
|
|
StringBuilder sbFind = new StringBuilder();
|
|||
|
|
dic = FixChilderNames.GetEnumerator();
|
|||
|
|
while (dic.MoveNext())
|
|||
|
|
{
|
|||
|
|
string[] names = dic.Current.Key.Split('/');
|
|||
|
|
string name = names[names.Length - 1];
|
|||
|
|
string value = dic.Current.Value;
|
|||
|
|
string path = dic.Current.Key;
|
|||
|
|
path = path.Substring(SelTran.name.Length + 1);
|
|||
|
|
if (!msg.Contains(name))
|
|||
|
|
{
|
|||
|
|
sbFind.AppendFormat("\t\t{0} = transform.Find<{2}>(\"{1}\");", name, path, value);
|
|||
|
|
sbFind.AppendLine();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (value == Rules["Btn"]) FixBtnNames.Add(name);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sbFind.AppendLine("\t\t" + FixFind);
|
|||
|
|
|
|||
|
|
StringBuilder sbAddEvent = new StringBuilder();
|
|||
|
|
for (int i = 0; i < FixBtnNames.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (!msg.Contains(FixBtnNames[i]))
|
|||
|
|
{
|
|||
|
|
sbAddEvent.AppendFormat("\t\tEventTriggerListener.Get({0}.gameObject).onClick = BtnClicked;",
|
|||
|
|
FixBtnNames[i]);
|
|||
|
|
sbAddEvent.AppendLine();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sbAddEvent.AppendLine("\t\t" + FixAddEvent);
|
|||
|
|
|
|||
|
|
StringBuilder sbEvent = new StringBuilder();
|
|||
|
|
for (int i = 0; i < FixBtnNames.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (!msg.Contains(FixBtnNames[i]))
|
|||
|
|
{
|
|||
|
|
sbEvent.AppendFormat("\t\telse if({0}.gameObject==go)", FixBtnNames[i]);
|
|||
|
|
CreatEvent(sbEvent, i);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sbEvent.AppendLine("\t\t" + FixEvent);
|
|||
|
|
Debug.Log(msg);
|
|||
|
|
msg = msg.Replace(FixDef, sbDef.ToString()).Replace(FixFind, sbFind.ToString())
|
|||
|
|
.Replace(FixAddEvent, sbAddEvent.ToString()).Replace(FixEvent, sbEvent.ToString());
|
|||
|
|
Debug.Log(msg);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CreateFile()
|
|||
|
|
{
|
|||
|
|
childrenNames = new Dictionary<string, string>();
|
|||
|
|
names = new List<string>();
|
|||
|
|
btnNames = new List<string>();
|
|||
|
|
GetChildren(SelTran);
|
|||
|
|
CreateScript(Application.dataPath + "/" + SelTran.name.Replace(" ", "") + ".cs",
|
|||
|
|
DealScript().ToString());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GetChildren(Transform tran, string name = "", string rule = "")
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(name)) name = tran.name;
|
|||
|
|
int childNum = tran.childCount;
|
|||
|
|
if (string.IsNullOrEmpty(rule)) //Create
|
|||
|
|
{
|
|||
|
|
Debug.Log(AddName(tran.name) + "进入1");
|
|||
|
|
string value = AddName(tran.name);
|
|||
|
|
if (!string.IsNullOrEmpty(value))
|
|||
|
|
{
|
|||
|
|
Debug.Log("进入" + tran.name);
|
|||
|
|
childrenNames.Add(name, value); //符合规则,加入列表
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else //fix
|
|||
|
|
{
|
|||
|
|
string valuefix = AddName(tran.name, rule);
|
|||
|
|
if (!string.IsNullOrEmpty(valuefix)) FixChilderNames.Add(name, valuefix);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (childNum == 0)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string temp = name;
|
|||
|
|
for (int i = 0; i < childNum; i++)
|
|||
|
|
{
|
|||
|
|
temp = name;
|
|||
|
|
temp = temp + "/" + tran.GetChild(i).name;
|
|||
|
|
GetChildren(tran.GetChild(i), temp, rule);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
///检测关键字是否包含返回字段
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="name">新增的物体</param>
|
|||
|
|
/// <param name="rule">关键字段</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
string AddName(string name, string rule = "")
|
|||
|
|
{
|
|||
|
|
if (names.Contains(name))
|
|||
|
|
{
|
|||
|
|
Debug.LogError(name + "重名!!!!");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
foreach (KeyValuePair<string, string> item in Rules)
|
|||
|
|
{
|
|||
|
|
if (name.Contains(item.Key))
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(rule)) //Create
|
|||
|
|
{
|
|||
|
|
return item.Value;
|
|||
|
|
}
|
|||
|
|
else //fix
|
|||
|
|
{
|
|||
|
|
Debug.Log(item + "----------------");
|
|||
|
|
Debug.Log(name + "----------------" + rule);
|
|||
|
|
|
|||
|
|
if (name.Contains(rule) && mode == Mode.以关键字更新) return item.Value;
|
|||
|
|
else if (name.Equals(rule) && mode == Mode.指定更新) return item.Value;
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
isHelp = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return string.Empty;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
StringBuilder DealScript()
|
|||
|
|
{
|
|||
|
|
StringBuilder sb = new StringBuilder();
|
|||
|
|
sb.AppendLine("using UnityEngine;");
|
|||
|
|
sb.AppendLine("using UnityEngine.UI;");
|
|||
|
|
sb.AppendLine("using System.Text;");
|
|||
|
|
sb.AppendLine("using WFramework;");
|
|||
|
|
sb.AppendLine();
|
|||
|
|
sb.AppendLine();
|
|||
|
|
|
|||
|
|
sb.AppendFormat("public class {0} : MonoBehaviour ", SelTran.name.Replace(" ", ""));
|
|||
|
|
sb.AppendLine();
|
|||
|
|
sb.AppendLine("{");
|
|||
|
|
|
|||
|
|
var dic = childrenNames.GetEnumerator();
|
|||
|
|
while (dic.MoveNext())
|
|||
|
|
{
|
|||
|
|
string[] names = dic.Current.Key.Split('/');
|
|||
|
|
string name = names[names.Length - 1];
|
|||
|
|
string value = dic.Current.Value;
|
|||
|
|
sb.AppendFormat("\tprivate {0} {1};", value, name);
|
|||
|
|
sb.AppendLine();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sb.AppendLine("\t" + FixDef);
|
|||
|
|
|
|||
|
|
sb.AppendLine("\tvoid Awake() {");
|
|||
|
|
sb.AppendLine("\t\tInit();");
|
|||
|
|
sb.AppendLine("\t}");
|
|||
|
|
|
|||
|
|
sb.AppendLine();
|
|||
|
|
sb.AppendLine("\tvoid Init() {");
|
|||
|
|
sb.AppendLine();
|
|||
|
|
|
|||
|
|
dic = childrenNames.GetEnumerator();
|
|||
|
|
Debug.Log(childrenNames.Count);
|
|||
|
|
while (dic.MoveNext())
|
|||
|
|
{
|
|||
|
|
string[] names = dic.Current.Key.Split('/');
|
|||
|
|
string name = names[names.Length - 1];
|
|||
|
|
string value = dic.Current.Value;
|
|||
|
|
string path = dic.Current.Key;
|
|||
|
|
path = path.Substring(SelTran.name.Length + 1);
|
|||
|
|
|
|||
|
|
|
|||
|
|
sb.AppendFormat("\t\t{0} =transform.Find<{2}>(\"{1}\");", name, path, value);
|
|||
|
|
sb.AppendLine();
|
|||
|
|
if (value == Rules["Btn"]) btnNames.Add(name);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sb.AppendLine("\t\t" + FixFind);
|
|||
|
|
sb.AppendLine();
|
|||
|
|
|
|||
|
|
for (int i = 0; i < btnNames.Count; i++)
|
|||
|
|
{
|
|||
|
|
sb.AppendFormat("\t\tEventTriggerListener.Get({0}.gameObject).onClick = BtnClicked;", btnNames[i]);
|
|||
|
|
sb.AppendLine();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sb.AppendLine("\t\t" + FixAddEvent);
|
|||
|
|
sb.AppendLine();
|
|||
|
|
|
|||
|
|
sb.AppendLine("\t}");
|
|||
|
|
|
|||
|
|
sb.AppendLine();
|
|||
|
|
sb.AppendLine("\tvoid BtnClicked(GameObject go)");
|
|||
|
|
sb.AppendLine("\t{");
|
|||
|
|
for (int i = 0; i < btnNames.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (i == 0)
|
|||
|
|
{
|
|||
|
|
sb.AppendFormat("\t\tif({0}.gameObject==go)", btnNames[i]);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
sb.AppendFormat("\t\telse if({0}.gameObject==go)", btnNames[i]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CreatEvent(sb, i);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sb.AppendLine("\t\t" + FixEvent);
|
|||
|
|
sb.AppendLine("\t}");
|
|||
|
|
sb.AppendLine();
|
|||
|
|
sb.AppendLine("}");
|
|||
|
|
|
|||
|
|
return sb;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建方法里的Event
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="sb"></param>
|
|||
|
|
/// <param name="index"></param>
|
|||
|
|
private void CreatEvent(StringBuilder sb, int index = 0)
|
|||
|
|
{
|
|||
|
|
sb.AppendLine();
|
|||
|
|
sb.AppendLine("\t\t{");
|
|||
|
|
sb.AppendFormat("\t\t\tDebug.Log({0}+\"Clicked\");", btnNames[index]);
|
|||
|
|
sb.AppendLine();
|
|||
|
|
sb.AppendLine("\t\t}");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CreateScript(string path, string msg)
|
|||
|
|
{
|
|||
|
|
StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8);
|
|||
|
|
sw.Write(msg);
|
|||
|
|
sw.Flush();
|
|||
|
|
sw.Close();
|
|||
|
|
Debug.Log("ok----------");
|
|||
|
|
AssetDatabase.Refresh();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|