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); } }