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 { /// /// 底层、中层、上层、系统层 /// private readonly Transform[] layers; /// /// canvas /// public RectTransform canvas; /// /// 存储显示的panel /// private readonly Dictionary panelDic = new Dictionary(); private TipItem tipItemPrefab; public TipItem tipItem; private UI_FadePanel _FadePanelPrefab; public UI_FadePanel fadePanel; /// /// 构造函数 /// public UIManager() { canvas = ResourcesManager.Load("UI/Base/Canvas").GetComponent(); GameObject.DontDestroyOnLoad(canvas.gameObject); tipItemPrefab = ResourcesManager.Load("UI/UI_Item/TipItem/TipItem"); tipItem = GameObject.Instantiate(tipItemPrefab, canvas); tipItem.HideTips(); _FadePanelPrefab = ResourcesManager.Load("UI/UI_Item/UI_FadePanel/UI_FadePanel"); fadePanel = GameObject.Instantiate(_FadePanelPrefab, canvas); fadePanel.HidePanel(); layers = new Transform[] { canvas.transform.Find("Bot"), canvas.transform.Find("Mid"), canvas.transform.Find("Top"), canvas.transform.Find("System") }; } /// /// 显示面板 要求:面板类型和面板名称相同 /// /// 面板类型 面板名称 /// 显示在哪一层 /// 加载完成后 要做的 public void ShowPanel(MonoBehaviour target, E_UI_Layer layer = E_UI_Layer.Mid, UnityAction action = null) where T : BasePanel { string panelName = typeof(T).Name; //重复调用问题 1 已经存在的panel if (panelDic.TryGetValue(panelName, out var panel)) { panel.ShowMe(); action?.Invoke(panel as T); return; } string resourcePath = "UI/UIPanel/" + panelName; //重复调用 同一帧调用多次问题 ResourcesManager.LoadAsync(target, resourcePath, (panelObj) => { if (panelObj == null) { // 资源加载失败处理 Debug.LogError($"Failed to load panel: {panelName}"); return; } var uilayer = layers[(int)layer]; 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) { // 使用数组简化 GetLayer 方法 return layers[(int)layer]; } /// /// 给控件添加自定义事件 /// /// 控件对象 /// 事件类型 /// 委托 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); } }