using System; using System.Linq; using System.Reflection; using FairyGUI; using UnityEngine; namespace NBC { public static class UIExtension { public static void AutoFindAllField(this T self) where T : UIPanel { var fields = self.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (var field in fields) { var attrs = field.GetCustomAttributes().ToArray(); if (attrs.Length <= 0) continue; var findInfo = attrs[0]; var name = string.IsNullOrEmpty(findInfo.Name) ? field.Name : findInfo.Name; object obj; // var type = field.FieldType; if (field.FieldType == typeof(Controller)) { obj = self.ContentPane.GetController(name); } else if (field.FieldType == typeof(Transition)) { obj = self.ContentPane.GetTransition(name); } else { obj = self.ContentPane.GetChild(name); } if (obj == null) { throw new Exception("查找子物体失败" + "type=" + field.FieldType + "/name=" + findInfo.Name); } // Log.I(self.UIResName + "查找子物体" + "type=" + field.FieldType + "/name=" + findInfo.Name); field.SetValue(self, obj); } } /// /// 自动注册点击事件 /// /// /// FGUI中按钮以什么开头 /// /// public static void AutoAddClick(this T self, Action onClick, string btnStartName = "Btn") where T : UIPanel { for (int i = 0; i < self.ContentPane.numChildren; i++) { GObject gObject = self.ContentPane.GetChildAt(i); if (gObject.name.StartsWith(btnStartName)) { gObject.onClick.Add(a => { onClick?.Invoke(a.sender as GComponent); }); } } } public static void AutoClearClick(this T self, string btnStartName = "Btn") where T : UIPanel { for (int i = 0; i < self.ContentPane.numChildren; i++) { GObject gObject = self.ContentPane.GetChildAt(i); if (gObject.name.StartsWith(btnStartName)) { gObject.onClick.Clear(); } } } /// /// 自动注册点击事件 /// /// /// /// /// public static void AutoAddClick(this GComponent self, Action onClick, string btnStartName = "Btn") { for (int i = 0; i < self.numChildren; i++) { GObject gObject = self.GetChildAt(i); if (gObject.name.StartsWith(btnStartName)) { gObject.onClick.Add(a => { onClick?.Invoke(a.sender as GComponent); }); } } } public static void AutoSetClick(this GComponent self, Action onClick, string btnStartName = "Btn") { for (int i = 0; i < self.numChildren; i++) { GObject gObject = self.GetChildAt(i); if (gObject.name.StartsWith(btnStartName)) { gObject.onClick.Set(a => { onClick?.Invoke(a.sender as GComponent); }); } } } public static void AutoClearClick(this GComponent self, string btnStartName = "Btn") { for (int i = 0; i < self.numChildren; i++) { GObject gObject = self.GetChildAt(i); if (gObject.name.StartsWith(btnStartName)) { gObject.onClick.Clear(); } } } } }