using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
///
/// 可以根据需求继续增加层级
///
public enum E_UI_Layer
{
///
/// 最下层
///
Bot,
///
/// 中间层
///
Mid,
///
/// 上层 加载页面
///
Top,
///
/// 最上层 系统层 警告、错误
///
System,
}
///
/// UI管理器
///
///
public class UIManager : BaseManager
{
///
/// 底层、中层、上层、系统层
///
private readonly Transform bot, mid, top, system;
///
/// canvas
///
public RectTransform canvas;
///
/// 存储显示的panel
///
private readonly Dictionary panelDic = new Dictionary();
///
/// 提示ui预制体和实列化
///
private ImageTips imageTipsPrefab;
public ImageTips imageTips;
///
/// 工具提示预制体和实列化
///
private ToolInfoTips toolTipsPrefab;
public ToolInfoTips toolTips;
///
/// 构造函数
///
private UIManager()
{
canvas = ResourcesManager.Instance.Load("UI/Base/Canvas").GetComponent();
GameObject.DontDestroyOnLoad(canvas.gameObject);
bot = canvas.transform.Find("Bot");
mid = canvas.transform.Find("Mid");
top = canvas.transform.Find("Top");
system = canvas.transform.Find("System");
imageTipsPrefab = ResourcesManager.Instance.Load("UI/UI_Tip/ImageTips");
imageTips = GameObject.Instantiate(imageTipsPrefab, canvas);
imageTips.HideTips();
toolTipsPrefab = ResourcesManager.Instance.Load("UI/UI_Tip/ToolInfoTips");
toolTips = GameObject.Instantiate(toolTipsPrefab, canvas);
toolTips.HideTips();
}
///
/// 显示面板 要求:面板类型和面板名称相同
///
/// 面板类型 面板名称
/// 显示在哪一层
/// 加载完成后 要做的
public void ShowPanel(E_UI_Layer layer = E_UI_Layer.Mid, UnityAction action = null) where T : BasePanel
{
string panelName = typeof(T).Name;
//重复调用问题 1 已经存在的panel
if (panelDic.ContainsKey(panelName))
{
panelDic[panelName].ShowMe();
action?.Invoke(panelDic[panelName] as T);
return;
}
//重复调用 同一帧调用多次问题
ResourcesManager.Instance.LoadAsync("UI/UI_Panel/" + panelName, (panelObj) =>
{
Transform uilayer = bot;
switch (layer)
{
case E_UI_Layer.Mid:
uilayer = mid;
break;
case E_UI_Layer.Top:
uilayer = top;
break;
case E_UI_Layer.System:
uilayer = system;
break;
}
panelObj.transform.SetParent(uilayer);
panelObj.transform.localPosition = Vector3.zero;
panelObj.transform.localRotation = Quaternion.identity;
panelObj.transform.localScale = Vector3.one;
(panelObj.transform as RectTransform).offsetMax = Vector3.zero;
(panelObj.transform as RectTransform).offsetMin = Vector3.zero;
T panel = panelObj.GetComponent();
panel.ShowMe();
action?.Invoke(panel);
panelDic.Add(panelName, panel);
});
}
///
/// 隐藏面板
///
///
public void HidePanel() where T : BasePanel
{
string panelName = typeof(T).Name;
if (panelDic.ContainsKey(panelName))
{
panelDic[panelName].HideMe();
GameObject.Destroy(panelDic[panelName].gameObject);
panelDic.Remove(panelName);
}
else
{
Debug.Log("显示的面板中不存在要隐藏的面板!!!!");
}
}
///
/// 获取一个已显示的面板
///
/// 想要获取的面板脚本
///
public T GetPanel() where T : BasePanel
{
string panelName = typeof(T).Name;
if (panelDic.ContainsKey(panelName))
{
return panelDic[panelName] as T;
}
return null;
}
///
/// 获取UI面板层
///
///
///
public Transform GetLayer(E_UI_Layer layer)
{
switch (layer)
{
case E_UI_Layer.Bot:
return bot;
case E_UI_Layer.Mid:
return mid;
case E_UI_Layer.Top:
return top;
case E_UI_Layer.System:
return system;
default:
return null;
}
}
///
/// 给控件添加自定义事件
///
/// 控件对象
/// 事件类型
/// 委托
public void AddEventTriggerListener(UIBehaviour control, EventTriggerType type,
UnityAction action)
{
var eventTrigger = control.GetOrAddComponent();
EventTrigger.Entry entry = new EventTrigger.Entry() { eventID = type };
entry.callback.AddListener(action);
eventTrigger.triggers.Add(entry);
}
}