
BasePanel.cs
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;/// <summary>/// 通过代码,快速找到所有子控件/// </summary>public class BasePanel : MonoBehaviour{private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();//里氏转换,所有控件// Start is called before the first frame updatevoid Awake(){FindChildrenControl<Button>();FindChildrenControl<Image>();FindChildrenControl<Toggle>();FindChildrenControl<Text>();FindChildrenControl<Scrollbar>();FindChildrenControl<ScrollRect>();FindChildrenControl<Slider>();}/// <summary>/// 显示/// </summary>public virtual void ShowMe(){}/// <summary>/// 隐藏/// </summary>public virtual void HideMe(){}/// <summary>/// 得到对应名字的控件/// </summary>/// <typeparam name="T"></typeparam>/// <param name="controlName"></param>/// <returns></returns>protected T GetControl<T>(string controlName)where T: UIBehaviour{if (controlDic.ContainsKey(controlName)){//for循环字典for(int i = 0; i < controlDic[controlName].Count; ++i){if(controlDic[controlName][i] is T){return controlDic[controlName][i] as T;}}}return null;}/// <summary>/// 找Panel的控件们/// </summary>/// <typeparam name="T"></typeparam>private void FindChildrenControl<T>() where T: UIBehaviour{T[] controls = this.GetComponentsInChildren<T>();//Panel所有的Button组件//循环找所有控件,保存到字典里for (int i = 0; i < controls.Length; ++i){string objName = controls[i].gameObject.name;//这是控件名字//字典有就加,没有就新建if (controlDic.ContainsKey(objName))controlDic[objName].Add(controls[i]);elsecontrolDic.Add(objName, new List<UIBehaviour>() { controls[i] });}}}
UIManager.cs
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Events;//枚举,UI层级public enum E_UI_Layer{Bot,Mid,Top,System,}public class UIManager : BaseManager<UIManager>{public Dictionary<string, BasePanel> panelDict = new Dictionary<string, BasePanel>();//层级private Transform bot;//获得botprivate Transform mid;//获得midprivate Transform top;//获得topprivate Transform system;//获得system/// <summary>/// 构造函数:创建Canvas和EventSystem/// </summary>public UIManager(){GameObject obj = ResourcesManager.GetInstance().Load<GameObject>("UI/Canvas");Transform canvas = obj.transform;Object.DontDestroyOnLoad(obj);//过场景不移除//找到各层bot = canvas.Find("Bot");mid = canvas.Find("Mid");top = canvas.Find("Top");system = canvas.Find("System");GameObject es = ResourcesManager.GetInstance().Load<GameObject>("UI/EventSystem");Object.DontDestroyOnLoad(es);//过场景不移除}/// <summary>/// 显示面板/// </summary>/// <typeparam name="T">面板脚本类型</typeparam>/// <param name="panelName">面板名</param>/// <param name="layer">层级(可不填)</param>/// <param name="callBack">创建面板预设成功后做的事(可不填)</param>public void ShowPanel<T>(string panelName,E_UI_Layer layer = E_UI_Layer.Mid,UnityAction<T> callBack = null)where T:BasePanel{if (panelDict.ContainsKey(panelName)){panelDict[panelName].ShowMe();if (callBack != null)callBack(panelDict[panelName] as T); return;}ResourcesManager.GetInstance().LoadAsync<GameObject>("UI/" + panelName, (obj) =>{//把它作为canvas的子对象,位置//确定显示层级Transform father = bot;switch (layer){case E_UI_Layer.Mid:father = mid;break;case E_UI_Layer.Top:father = top;break;case E_UI_Layer.System:father = system;break;}//设置父对象 相对位置 大小obj.transform.SetParent(father);obj.transform.localPosition = Vector3.zero;obj.transform.localScale = Vector3.one;(obj.transform as RectTransform).offsetMax = Vector3.zero;(obj.transform as RectTransform).offsetMin = Vector3.zero;//得到预设体身上的脚本T panel = obj.GetComponent<T>();if (callBack != null)callBack(panel);//保存在字典里panelDict.Add(panelName, panel);});}/// <summary>/// 隐藏/// </summary>public void HidePanel(string panelName){if (panelDict.ContainsKey(panelName)){panelDict[panelName].HideMe();GameObject.Destroy(panelDict[panelName].gameObject);panelDict.Remove(panelName);}}}