using System; using System.Collections.Generic; using System.IO; using System.Text; using Runtime.Helper; using TMPro; using UnityEditor; using UnityEngine; using UnityEngine.UI; namespace HK.Editor { public class GenUIDataEditor : UnityEditor.Editor { private static string itemFolderPath = $"{Application.dataPath}/Scripts/FUJIFILM/UI/Item"; private static string logicFolderPath = $"{Application.dataPath}/Scripts/FUJIFILM/UI/Logic"; private static string templatePath = $"{Application.dataPath}/Resources/Template/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.GetOrAddComponent(); 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.GetOrAddComponent(); 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("txt") || go.name.Contains("btn_") || go.name.Contains("btn") || go.name.Contains("tog_") || go.name.Contains("tog") || go.name.Contains("img_") || go.name.Contains("img") || go.name.Contains("inp_") || go.name.Contains("inp") || go.name.Contains("panel_") || go.name.Contains("panel") || go.name.Contains("dro_") || go.name.Contains("dro") || go.name.Contains("go_") || go.name.Contains("go") || go.name.Contains("scr_") || go.name.Contains("scr") || go.name.Contains("raw_") || go.name.Contains("raw") || go.name.Contains("sli_") || 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/自动生成Item并绑定数据")] public static void FindClassAndGenBindItemData() { // var go = Selection.activeObject as GameObject; foreach (var go in Selection.gameObjects) { var binding = go.GetOrAddComponent(); var substring = go.name.Replace("UI", ""); Debug.Log(substring); if (!substring.Contains("Item")) { substring = $"{substring}Item"; } string filePath = $"{itemFolderPath}/{substring}.cs"; string allText; if (!Directory.Exists(itemFolderPath)) { Directory.CreateDirectory(itemFolderPath); } allText = File.ReadAllText(templatePath); if (!File.Exists(filePath)) { File.Create(filePath).Dispose(); } else { if (!EditorUtility.DisplayDialog("提示", $"是否确认删除‘{substring}’脚本的内容?", "ok", "cancel")) { Debug.Log("取消生成"); return; } } allText = allText.Replace("#CLASSNAME#", substring); allText = allText.Replace("#VARIABLEDEFINITION#", ReplaceVD(binding.Datas)); allText = allText.Replace("#INITFIND#", ReplaceInitBind(binding.Datas)); allText = allText.Replace("#INITADDLISTENER#", ReplaceInitAddListener(binding.Datas)); allText = allText.Replace("#METHOD#", ReplaceAddMethod(binding.Datas)); allText = allText.Replace("#DISPOSE#", ReplaceDisposeRemoveListener(binding.Datas)); allText = allText.Replace("#DISPOSEISNULL#", ReplaceDisposeIsNull(binding.Datas)); allText = allText.Replace("#BASE#", "UIItemBase"); File.WriteAllText(filePath, allText); Debug.Log("自动生成绑定数据 完成"); } } [MenuItem("GameObject/ZTool/UITool/自动生成UI并绑定数据")] public static void FindClassAndGenBindData() { // var go = Selection.activeObject as GameObject; foreach (var go in Selection.gameObjects) { var binding = go.GetOrAddComponent(); var substring = go.name.Replace("UI", ""); Debug.Log(substring); substring = $"{substring}UI"; string filePath = $"{logicFolderPath}/{substring}.cs"; string allText; if (!Directory.Exists(logicFolderPath)) { Directory.CreateDirectory(logicFolderPath); } allText = File.ReadAllText(templatePath); if (!File.Exists(filePath)) { File.Create(filePath).Dispose(); } else { if (!EditorUtility.DisplayDialog("提示", $"是否确认删除‘{substring}’脚本的内容?", "ok", "cancel")) { Debug.Log("取消生成"); return; } } allText = allText.Replace("#CLASSNAME#", substring); allText = allText.Replace("#VARIABLEDEFINITION#", ReplaceVD(binding.Datas)); allText = allText.Replace("#INITFIND#", ReplaceInitBind(binding.Datas)); allText = allText.Replace("#INITADDLISTENER#", ReplaceInitAddListener(binding.Datas)); allText = allText.Replace("#METHOD#", ReplaceAddMethod(binding.Datas)); allText = allText.Replace("#DISPOSE#", ReplaceDisposeRemoveListener(binding.Datas)); allText = allText.Replace("#DISPOSEISNULL#", ReplaceDisposeIsNull(binding.Datas)); allText = allText.Replace("#BASE#", "UIBase"); 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($"[SerializeField] private {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) || typeStr == nameof(TMP_Dropdown) || typeStr == nameof(Dropdown) || typeStr == nameof(ScrollRect)) { 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) {{}}"); } else if (typeStr == nameof(TMP_Dropdown) || typeStr == nameof(Dropdown)) { sb.AppendLine($"private void OnValueChanged{data.name}(int i) {{}}"); } else if (typeStr == nameof(ScrollRect)) { sb.AppendLine($"private void OnValueChanged{data.name}(Vector2 v) {{}}"); } } 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) || typeStr == nameof(TMP_Dropdown) || typeStr == nameof(Dropdown) || typeStr == nameof(ScrollRect)) { 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 TMP_Dropdown tmpDropdown)) { return nameof(TMP_Dropdown); } else if (data.go.TryGetComponent(out Dropdown dropdown)) { return nameof(Dropdown); } else if (data.go.TryGetComponent(out ScrollRect scrollRect)) { return nameof(ScrollRect); } else if (data.go.TryGetComponent(out Image image)) { return nameof(Image); } else if (data.go.TryGetComponent(out RawImage rawImage)) { return nameof(RawImage); } else if (data.go.TryGetComponent(out GameObject go)) { return nameof(GameObject); } return String.Empty; } } }