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 update
void 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]);
else
controlDic.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;//获得bot
private Transform mid;//获得mid
private Transform top;//获得top
private 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);
}
}
}