using System; using System.Collections.Generic; using System.IO; using System.Text; using TMPro; using UnityEditor; using UnityEngine; using UnityEngine.UI; using ZC; namespace ZEditor { public class GenUIDataEditor : Editor { private static string logicFolderPath = $"{Application.dataPath}/DemoGame/GameScript/Hotfix/UI/Logic"; private static string templatePath = $"{Application.dataPath}/DemoGame/GameRes/UILogicTemplate.txt"; [MenuItem("GameObject/ZTool/UITool/自动绑定数据")] public static void AutoBindData() { foreach (var go in Selection.gameObjects) { List list = new List(); FindUI(go.transform, ref list); var binding = go.GetComponent(); foreach (var transform in list) { binding.AddValue(transform); } EditorUtility.SetDirty(go); Debug.Log("自动绑定数据 完成"); } } [MenuItem("GameObject/ZTool/UITool/清空并自动绑定数据")] public static void ClearAndAutoBindData() { foreach (var go in Selection.gameObjects) { List list = new List(); FindUI(go.transform, ref list); var binding = go.GetComponent(); binding.ClearValue(); foreach (var transform in list) { binding.AddValue(transform); } EditorUtility.SetDirty(go); Debug.Log("清空并自动绑定数据 完成"); } } static void FindUI(Transform go, ref List list) { if (go.name.Contains("txt_") || go.name.Contains("btn_") || go.name.Contains("tog_") || go.name.Contains("img_") || go.name.Contains("inp_") || go.name.Contains("panel_") || go.name.Contains("sli_")) { list.Add(go); } for (var i = 0; i < go.childCount; i++) { FindUI(go.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 binding = go.GetComponent(); var substring = go.name.Replace("UI", ""); Debug.Log(substring); substring = $"{substring}UI"; string filePath = $"{logicFolderPath}/{substring}.cs"; string allText; 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(binding.AllData)); allText = allText.Replace("#INITFIND#", ReplaceInitBind(binding.AllData)); allText = allText.Replace("#INITADDLISTENER#", ReplaceInitAddListener(binding.AllData)); allText = allText.Replace("#METHOD#", ReplaceAddMethod(binding.AllData)); allText = allText.Replace("#DISPOSE#", ReplaceDisposeRemoveListener(binding.AllData)); allText = allText.Replace("#DISPOSEISNULL#", ReplaceDisposeIsNull(binding.AllData)); File.WriteAllText(filePath, allText); Debug.Log("自动生成绑定数据 完成"); } } static string ReplaceVD(IReadOnlyList AllData) // 定义 { StringBuilder sb = new StringBuilder(); foreach (var data in AllData) { var typeStr = CheckType(data); sb.AppendLine($"public {typeStr} {data.name};"); } return sb.ToString(); } static string ReplaceInitBind(IReadOnlyList AllData) // 定义 { StringBuilder sb = new StringBuilder(); foreach (var data in AllData) { var typeStr = CheckType(data); sb.AppendLine($"{data.name} = GetValue<{typeStr}>(\"{data.name}\");"); } return sb.ToString(); } static string ReplaceInitAddListener(IReadOnlyList AllData) // 定义 { StringBuilder sb = new StringBuilder(); foreach (var data in AllData) { 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 AllData) // 定义 { StringBuilder sb = new StringBuilder(); foreach (var data in AllData) { 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 AllData) // 定义 { StringBuilder sb = new StringBuilder(); foreach (var data in AllData) { 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 AllData) // 定义 { StringBuilder sb = new StringBuilder(); foreach (var data in AllData) { var typeStr = CheckType(data); sb.AppendLine($"{data.name} = null;"); } return sb.ToString(); } static string CheckType(GameObjectBindingData data) { if (data.go.TryGetComponent(out Button button)) { return nameof(Button); } else if (data.go.TryGetComponent(out TMP_InputField inputField_TMP)) { return nameof(TMP_InputField); } else if (data.go.TryGetComponent(out InputField inputField)) { return nameof(InputField); } else if (data.go.TryGetComponent(out Slider slider)) { return nameof(Slider); } else if (data.go.TryGetComponent(out Toggle toggle)) { return nameof(Toggle); } else if (data.go.TryGetComponent(out TMP_Text tmpText)) { return nameof(TMP_Text); } else if (data.go.TryGetComponent(out Text text)) { return nameof(Text); } else if (data.go.TryGetComponent(out Image image)) { return nameof(Image); } return String.Empty; } } }