Files
plugin-library/Assets/00.StaryEvo/Editor/FixPanelScript.cs
2025-03-31 11:16:52 +08:00

444 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/****************************************************
文件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();
}
}
}
}