EditorTool3D/Assets/ZXL/Scripts/Editor/ZUITool.cs

235 lines
7.8 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using TMPro;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
namespace ZEditor
{
class UIEditorData
{
public Transform tran;
public string uiType;
public string uiName;
public string uiLinstenerName;
}
[InitializeOnLoad]
public class ZUITool : UnityEditor.Editor
{
private static string logicFolderPath = $"{Application.dataPath}/ZXL/Scripts/UI/Logic";
private static string templatePath = $"{Application.dataPath}/ZXL/Scripts/Editor/UILogicTemplate.txt";
static void FindUI(Transform tran, ref List<GameObject> list)
{
if (tran.name.Contains("tog") ||
tran.name.Contains("img") ||
tran.name.Contains("inp") ||
tran.name.Contains("txt") ||
tran.name.Contains("sli") ||
tran.name.Contains("pan") ||
tran.name.Contains("raw") ||
tran.name.Contains("dro") ||
tran.name.Contains("btn"))
{
list.Add(tran.gameObject);
}
for (var i = 0; i < tran.childCount; i++)
{
FindUI(tran.GetChild(i), ref list);
}
}
[MenuItem("GameObject/ZTool/UITool/自动生成绑定数据")]
public static void FindClassAndGenBindData()
{
// var go = Selection.activeObject as GameObject;
foreach (var go in Selection.gameObjects)
{
var list = new List<GameObject>();
FindUI(go.transform, ref list);
var substring = go.name + "Logic";
Debug.Log(substring);
string filePath = $"{logicFolderPath}/{substring}.cs";
string allText;
if (!Directory.Exists(logicFolderPath))
{
Directory.CreateDirectory(logicFolderPath);
}
if (!File.Exists(filePath))
{
File.Create(filePath).Dispose();
allText = File.ReadAllText(templatePath);
}
else
{
allText = File.ReadAllText(filePath);
}
allText = allText.Replace("#CLASSNAME#", substring);
allText = allText.Replace("#VARIABLEDEFINITION#", ReplaceVD(list));
allText = allText.Replace("#INITFIND#", ReplaceInitBind(list));
allText = allText.Replace("#INITADDLISTENER#", ReplaceInitAddListener(list));
allText = allText.Replace("#METHOD#", ReplaceAddMethod(list));
allText = allText.Replace("#DISPOSE#", ReplaceDisposeRemoveListener(list));
allText = allText.Replace("#DISPOSEISNULL#", ReplaceDisposeIsNull(list));
File.WriteAllText(filePath, allText);
Debug.Log("自动生成绑定数据 完成");
}
AssetDatabase.Refresh();
}
static string ReplaceVD(IReadOnlyList<GameObject> Datas) // 定义
{
StringBuilder sb = new StringBuilder();
foreach (var data in Datas)
{
var typeStr = CheckType(data);
sb.AppendLine($"public {typeStr} {data.name};");
}
return sb.ToString();
}
static string ReplaceInitBind(IReadOnlyList<GameObject> Datas) // 定义
{
StringBuilder sb = new StringBuilder();
foreach (var data in Datas)
{
var typeStr = CheckType(data);
sb.AppendLine($"{data.name} = transform.FindChildDeep<{typeStr}>(\"{data.name}\");");
}
return sb.ToString();
}
static string ReplaceInitAddListener(IReadOnlyList<GameObject> Datas) // 定义
{
StringBuilder sb = new StringBuilder();
foreach (var data in Datas)
{
var typeStr = CheckType(data);
if (typeStr == nameof(Button))
{
sb.AppendLine($"{data.name}.onClick.AddListener(OnClick{data.name});");
}
else if (typeStr == nameof(Slider) || typeStr == nameof(Toggle))
{
sb.AppendLine($"{data.name}.onValueChanged.AddListener(OnValueChanged{data.name});");
}
}
return sb.ToString();
}
static string ReplaceAddMethod(IReadOnlyList<GameObject> Datas) // 定义
{
StringBuilder sb = new StringBuilder();
foreach (var data in Datas)
{
var typeStr = CheckType(data);
if (typeStr == nameof(Button))
{
sb.AppendLine($"private void OnClick{data.name}() {{}}");
}
else if (typeStr == nameof(Slider))
{
sb.AppendLine($"private void OnValueChanged{data.name}(float f) {{}}");
}
else if (typeStr == nameof(Toggle))
{
sb.AppendLine($"private void OnValueChanged{data.name}(bool b) {{}}");
}
}
return sb.ToString();
}
static string ReplaceDisposeRemoveListener(IReadOnlyList<GameObject> Datas) // 定义
{
StringBuilder sb = new StringBuilder();
foreach (var data in Datas)
{
var typeStr = CheckType(data);
if (typeStr == nameof(Button))
{
sb.AppendLine($"{data.name}.onClick.RemoveListener(OnClick{data.name});");
}
else if (typeStr == nameof(Slider) || typeStr == nameof(Toggle))
{
sb.AppendLine($"{data.name}.onValueChanged.RemoveListener(OnValueChanged{data.name});");
}
}
return sb.ToString();
}
static string ReplaceDisposeIsNull(IReadOnlyList<GameObject> Datas) // 定义
{
StringBuilder sb = new StringBuilder();
foreach (var data in Datas)
{
var typeStr = CheckType(data);
sb.AppendLine($"{data.name} = null;");
}
return sb.ToString();
}
static string CheckType(GameObject go)
{
if (go.TryGetComponent(out Button button))
{
return nameof(Button);
}
else if (go.TryGetComponent(out TMP_InputField inputField_TMP))
{
return nameof(TMP_InputField);
}
else if (go.TryGetComponent(out InputField inputField))
{
return nameof(InputField);
}
else if (go.TryGetComponent(out Slider slider))
{
return nameof(Slider);
}
else if (go.TryGetComponent(out Toggle toggle))
{
return nameof(Toggle);
}
else if (go.TryGetComponent(out TMP_Text tmpText))
{
return nameof(TMP_Text);
}
else if (go.TryGetComponent(out Text text))
{
return nameof(Text);
}
else if (go.TryGetComponent(out RawImage rawImage))
{
return nameof(RawImage);
}
else if (go.TryGetComponent(out Dropdown dropdown))
{
return nameof(Dropdown);
}
else if (go.TryGetComponent(out Image image))
{
return nameof(Image);
}
return String.Empty;
}
}
}