143 lines
4.0 KiB
C#
143 lines
4.0 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Unity.VisualScripting;
|
|
using UnityEngine;
|
|
|
|
public enum E_UILayer
|
|
{
|
|
/// <summary>
|
|
/// 最底层
|
|
/// </summary>
|
|
Bottom,
|
|
/// <summary>
|
|
/// 中层
|
|
/// </summary>
|
|
Middle,
|
|
/// <summary>
|
|
/// 高层
|
|
/// </summary>
|
|
Top,
|
|
/// <summary>
|
|
/// 系统层 最高层
|
|
/// </summary>
|
|
System,
|
|
}
|
|
public class UIManager
|
|
{
|
|
private static UIManager instance = new UIManager();
|
|
public static UIManager Instance => instance;
|
|
|
|
//用于存储显示着的面板的 没显示一个面板 就会存入这个字典
|
|
//隐藏面板时 直接获取字典中的对应面板 进行隐藏
|
|
private Dictionary<string, BasePanel> panelDic = new Dictionary<string, BasePanel>();
|
|
|
|
//场景中 Canvas对象 用于设置为面板的父对象
|
|
private Transform canvasTrans;
|
|
|
|
//层级父对象
|
|
private Transform bottomLayer;
|
|
private Transform middleLayer;
|
|
private Transform topLayer;
|
|
private Transform systemLayer;
|
|
|
|
private UIManager()
|
|
{
|
|
//得到场景中的Canvas对象
|
|
GameObject canvas = GameObject.Instantiate(Resources.Load<GameObject>("UI/Canvas"));
|
|
canvasTrans = canvas.transform;
|
|
//通过过场景不移除该对象 保证这个游戏过程中 只有一个 canvas对象
|
|
GameObject.DontDestroyOnLoad(canvas);
|
|
|
|
//找到层级父对象
|
|
bottomLayer = canvas.transform.Find("Bottom");
|
|
middleLayer = canvas.transform.Find("Middle");
|
|
topLayer = canvas.transform.Find("Top");
|
|
systemLayer = canvas.transform.Find("System");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取对应层级的父对象
|
|
/// </summary>
|
|
/// <param name="layer">层级枚举值</param>
|
|
/// <returns></returns>
|
|
public Transform GetLayerFather(E_UILayer layer)
|
|
{
|
|
switch (layer)
|
|
{
|
|
case E_UILayer.Bottom:
|
|
return bottomLayer;
|
|
case E_UILayer.Middle:
|
|
return middleLayer;
|
|
case E_UILayer.Top:
|
|
return topLayer;
|
|
case E_UILayer.System:
|
|
return systemLayer;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
//显示面板
|
|
public T ShowPanel<T>(E_UILayer layer) where T:BasePanel
|
|
{
|
|
//我们只需要保证 泛型T的类型 和面板预设体名字 一样 定一个这样的规则 就可以非常方便的让我们使用了
|
|
string panelName = typeof(T).Name;
|
|
|
|
//判断 字典中 是否已经显示了这个面板
|
|
if (panelDic.ContainsKey(panelName))
|
|
{
|
|
return panelDic[panelName] as T;
|
|
}
|
|
|
|
//显示面板 根据面板名字 动态的创建预设体 设置父对象
|
|
GameObject panelObj = GameObject.Instantiate(Resources.Load<GameObject>("UI/" + panelName));
|
|
|
|
//层级的处理
|
|
Transform father = GetLayerFather(layer);
|
|
//避免没有按指定规则传递层级参数 避免为空
|
|
if (father == null)
|
|
father = middleLayer;
|
|
//把这个对象 放到场景中的Canvas下面
|
|
panelObj.transform.SetParent(father, false);
|
|
|
|
//执行面板上 显示逻辑 并且应该把它保存起来
|
|
T panel = panelObj.GetComponent<T>();
|
|
//把这个面板脚本 存储到字典中 方便之后的 获取 和 隐藏
|
|
panelDic.Add(panelName, panel);
|
|
|
|
return panel;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 隐藏面板
|
|
/// </summary>
|
|
/// <typeparam name="T">面板类名</typeparam>
|
|
/// <param name="isFade">是否淡出完毕过后才删除面板 默认是true</param>
|
|
public void HidePanel<T>() where T : BasePanel
|
|
{
|
|
//根据泛型的得到名字
|
|
string panelName = typeof(T).Name;
|
|
//判断当前显示的面板 有没有你想隐藏的
|
|
if (panelDic.ContainsKey(panelName))
|
|
{
|
|
//删除对象
|
|
GameObject.Destroy(panelDic[panelName].gameObject);
|
|
//删除字典里面存储的面板脚本
|
|
panelDic.Remove(panelName);
|
|
}
|
|
}
|
|
|
|
//得到面板
|
|
public T GetPanel<T>() where T : BasePanel
|
|
{
|
|
string panelName = typeof(T).Name;
|
|
if (panelDic.ContainsKey(panelName))
|
|
{
|
|
return panelDic[panelName] as T;
|
|
}
|
|
//如果没有对应显示的 就为空
|
|
return null;
|
|
}
|
|
}
|