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