using DG.Tweening; using System; using System.Collections; using System.Collections.Generic; using System.Xml.Schema; using UnityEngine; using UnityEngine.UI; namespace AFeijia.UI { public class UITool : MonoBehaviour { System.Reflection.BindingFlags FieldBindingFlags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.GetProperty; System.Reflection.BindingFlags PropertyBindingFlags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.GetProperty; private Graphic[] m_graphics; protected Graphic[] m_Graphics { get { if (m_graphics == null) { m_graphics = GetComponentsInChildren(); Array.ForEach(m_graphics, g => m_graphicColors.Add(g, g.color)); } return m_graphics; } } private Dictionary m_graphicColors = new Dictionary(); /// /// 各Graphic的初始Color /// protected Dictionary m_GraphicsColor => m_graphicColors; /// /// 所有继承该类的UI /// protected static List ui_tools = new List(); protected virtual void Awake() { ui_tools.Add(this); UIInit(); } /// /// 初始化UI 查找 /// protected void UIInit() { var myType = GetType(); try { //Field var myFields = myType.GetFields(FieldBindingFlags); foreach (var field in myFields) { var type = field.FieldType; var fieldName = field.Name; if (fieldName.Contains("<") && fieldName.Contains(">") && fieldName.Contains("k__BackingField")) continue; var target = RecursiveFind(transform, fieldName); if (target != null) { var component = target.GetComponent(field.FieldType); field.SetValue(this, component); } else { Debug.LogWarning("未找到字段:" + fieldName); } //if (type.Module.Name.Equals("UnityEngine.UI.dll")) //{ // //var fieldName = field.Name.Contains("_") ? field.Name.Split('_')[1] : field.Name; // var fieldName = field.Name; // var target = RecursiveFind(transform, fieldName); // if (target != null) // { // var component = target.GetComponent(field.FieldType); // field.SetValue(this, component); // } // else // { // Debug.Log("未找到:" + fieldName); // } //} } //Property var myProperties = myType.GetProperties(PropertyBindingFlags); foreach (var property in myProperties) { var type = property.PropertyType; var propertyName = property.Name; var target = RecursiveFind(transform, property.Name); if (target != null) { var component = target.GetComponent(property.PropertyType); property.SetValue(this, component); } else { Debug.Log("未找到属性:" + propertyName); } //if (type.Module.Name.Equals("UnityEngine.UI.dll")) //{ // var propertyName = property.Name.Contains("_") ? property.Name.Split('_')[1] : property.Name; // var target = RecursiveFind(transform, property.Name); // if (target != null) // { // var component = target.GetComponent(property.PropertyType); // property.SetValue(this, component); // } //} } } catch (Exception ex) { Debug.LogError("【UITool Log Error:[" + ex.Message + "]】" + ex.StackTrace); } } protected static T GetUI() { T res = default; var t = ui_tools.Find(x => x.GetType().Equals(typeof(T))); res = (T)Convert.ChangeType(t, typeof(T)); return res; } /// /// 设置Graphic是否可见 /// /// /// protected void SetGraphicVisible(bool visible, bool gradual = true) { if (!visible) { Array.ForEach(m_Graphics, (g) => { g.raycastTarget = false; if (gradual) DOTween.ToAlpha(() => g.color, x => g.color = x, 0, 0.5f).OnComplete(() => g.enabled = false); else { Color color = g.color; color.a = 0; g.color = color; g.enabled = false; } }); } else { Array.ForEach(m_Graphics, (g) => { g.enabled = true; if (gradual) DOTween.ToAlpha(() => g.color, x => g.color = x, m_GraphicsColor[g].a, 0.5f).OnComplete(() => g.raycastTarget = true); else { g.color = m_graphicColors[g]; g.raycastTarget = true; } }); } } public static void SetGraphicVisible(RectTransform obj, bool visible, bool gradual = true) { UITool tool = obj.GetComponentInParent(); if (tool == null) return; var m_graphics = obj.GetComponentsInChildren(); if (!visible) { Array.ForEach(m_graphics, (g) => { g.raycastTarget = false; if (gradual) DOTween.ToAlpha(() => g.color, x => g.color = x, 0, 0.5f).OnComplete(() => g.enabled = false); else { Color color = g.color; color.a = 0; g.color = color; g.enabled = false; } }); } else { Array.ForEach(m_graphics, (g) => { g.enabled = true; if (gradual) DOTween.ToAlpha(() => g.color, x => g.color = x, tool.m_GraphicsColor[g].a, 0.5f).OnComplete(() => g.raycastTarget = true); else { g.color = tool.m_graphicColors[g]; g.raycastTarget = true; } }); } } /// /// 递归查询 /// /// /// /// Transform RecursiveFind(Transform root, string target) { if (root.name == target) return root; var targetTra = root.Find(target); if (targetTra == null) { for (int i = 0; i < root.childCount; i++) { targetTra = RecursiveFind(root.GetChild(i), target); if (targetTra != null) return targetTra; } } return targetTra; } } }