From 80c1178b950cd53d0b0636d89789b09e52c69916 Mon Sep 17 00:00:00 2001 From: zxl Date: Fri, 22 Nov 2024 16:13:10 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=20=E6=B7=BB=E5=8A=A0ui=E7=94=9F?= =?UTF-8?q?=E6=88=90/=E4=BE=BF=E6=8D=B7=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/DemoGame/GameRes/UILogicTemplate.txt | 35 +++ .../DemoGame/GameRes/UILogicTemplate.txt.meta | 3 + .../GameScript/Editor/GenUIDataEditor.cs | 248 ++++++++++++++++++ .../GameScript/Editor/GenUIDataEditor.cs.meta | 3 + .../Loader/MonoBehaviour/GameObjectBinding.cs | 25 +- 5 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 Assets/DemoGame/GameRes/UILogicTemplate.txt create mode 100644 Assets/DemoGame/GameRes/UILogicTemplate.txt.meta create mode 100644 Assets/DemoGame/GameScript/Editor/GenUIDataEditor.cs create mode 100644 Assets/DemoGame/GameScript/Editor/GenUIDataEditor.cs.meta diff --git a/Assets/DemoGame/GameRes/UILogicTemplate.txt b/Assets/DemoGame/GameRes/UILogicTemplate.txt new file mode 100644 index 0000000..187b1fd --- /dev/null +++ b/Assets/DemoGame/GameRes/UILogicTemplate.txt @@ -0,0 +1,35 @@ +using UnityEngine.UI; +using TMPro; + +namespace ZC +{ + [UIType(UIType.#CLASSNAME#)] + public class #CLASSNAME# : UIBase + { +#VARIABLEDEFINITION# + public override void OnInit() + { + base.OnInit(); + #region AutoGen_Init + +#INITFIND# +#INITADDLISTENER# + #endregion + } + + #region AutoGen_Method + +#METHOD# + #endregion + + public override void OnDispose() + { + base.OnDispose(); + #region AutoGen_Dispose + +#DISPOSE# +#DISPOSEISNULL# + #endregion + } + } +} \ No newline at end of file diff --git a/Assets/DemoGame/GameRes/UILogicTemplate.txt.meta b/Assets/DemoGame/GameRes/UILogicTemplate.txt.meta new file mode 100644 index 0000000..71d1f73 --- /dev/null +++ b/Assets/DemoGame/GameRes/UILogicTemplate.txt.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0885d93c09f04445a5cd95b6c9f7c1a0 +timeCreated: 1732263033 \ No newline at end of file diff --git a/Assets/DemoGame/GameScript/Editor/GenUIDataEditor.cs b/Assets/DemoGame/GameScript/Editor/GenUIDataEditor.cs new file mode 100644 index 0000000..18b7f31 --- /dev/null +++ b/Assets/DemoGame/GameScript/Editor/GenUIDataEditor.cs @@ -0,0 +1,248 @@ +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; + } + } +} \ No newline at end of file diff --git a/Assets/DemoGame/GameScript/Editor/GenUIDataEditor.cs.meta b/Assets/DemoGame/GameScript/Editor/GenUIDataEditor.cs.meta new file mode 100644 index 0000000..657644c --- /dev/null +++ b/Assets/DemoGame/GameScript/Editor/GenUIDataEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 35f6268f26ad42dd9f6bd467f06e0829 +timeCreated: 1732263042 \ No newline at end of file diff --git a/Assets/DemoGame/GameScript/Loader/MonoBehaviour/GameObjectBinding.cs b/Assets/DemoGame/GameScript/Loader/MonoBehaviour/GameObjectBinding.cs index c1bdaa2..cf7cabd 100644 --- a/Assets/DemoGame/GameScript/Loader/MonoBehaviour/GameObjectBinding.cs +++ b/Assets/DemoGame/GameScript/Loader/MonoBehaviour/GameObjectBinding.cs @@ -9,6 +9,28 @@ namespace ZC { [SerializeField] private List Datas = new List(); +#if UNITY_EDITOR + public IReadOnlyList AllData => Datas; + + public void ClearValue() + { + Datas.Clear(); + } + + public void AddValue(Transform trans) + { + foreach (var data in Datas) + { + if (data.name == trans.name) + { + throw new ArgumentException($"重复添加了, {trans.name}"); + } + } + + Datas.Add(new GameObjectBindingData() { name = trans.name, go = trans.gameObject }); + } +#endif + public GameObject GetValue(string nameStr) { foreach (var data in Datas) @@ -21,7 +43,8 @@ namespace ZC throw new NullReferenceException($"没有找到绑定这个名字的物体,name:{nameStr}"); } - public T GetValue(string nameStr)where T: Component + + public T GetValue(string nameStr) where T : Component { foreach (var data in Datas) {