using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; /// /// UI层级 /// public enum E_UI_Layer { Bot, Mid, Top, System, } /// /// UI管理器 /// 1.管理所有显示的面板 /// 2.提供给外部 显示和隐藏等等接口 /// public class UIManager : BaseManager { public Dictionary panelDic = new Dictionary(); private Transform bot; private Transform mid; private Transform top; private Transform system; //记录我们UI的Canvas父对象 方便以后外部可能会使用它 public RectTransform canvas; public UIManager() { //创建Canvas 让其过场景的时候 不被移除 GameObject obj = ResMgr.GetInstance().Load("UI/Canvas"); canvas = obj.transform as RectTransform; GameObject.DontDestroyOnLoad(obj); //找到各层 bot = canvas.Find("Bot"); mid = canvas.Find("Mid"); top = canvas.Find("Top"); system = canvas.Find("System"); //创建EventSystem 让其过场景的时候 不被移除 obj = ResMgr.GetInstance().Load("UI/EventSystem"); GameObject.DontDestroyOnLoad(obj); } /// /// 通过层级枚举 得到对应层级的父对象 /// /// /// public Transform GetLayerFather(E_UI_Layer layer) { switch(layer) { case E_UI_Layer.Bot: return this.bot; case E_UI_Layer.Mid: return this.mid; case E_UI_Layer.Top: return this.top; case E_UI_Layer.System: return this.system; } return null; } /// /// 显示面板 /// /// 面板脚本类型 /// 面板名 /// 显示在哪一层 /// 当面板预设体创建成功后 你想做的事 public void ShowPanel(string panelName, E_UI_Layer layer = E_UI_Layer.Mid, UnityAction callBack = null) where T:BasePanel { if (panelDic.ContainsKey(panelName)) { panelDic[panelName].ShowMe(); // 处理面板创建完成后的逻辑 if (callBack != null) callBack(panelDic[panelName] as T); //避免面板重复加载 如果存在该面板 即直接显示 调用回调函数后 直接return 不再处理后面的异步加载逻辑 return; } ResMgr.GetInstance().LoadAsync("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 = Vector2.zero; (obj.transform as RectTransform).offsetMin = Vector2.zero; //得到预设体身上的面板脚本 T panel = obj.GetComponent(); // 处理面板创建完成后的逻辑 if (callBack != null) callBack(panel); panel.ShowMe(); //把面板存起来 panelDic.Add(panelName, panel); }); } /// /// 隐藏面板 /// /// public void HidePanel(string panelName) { if(panelDic.ContainsKey(panelName)) { panelDic[panelName].HideMe(); GameObject.Destroy(panelDic[panelName].gameObject); panelDic.Remove(panelName); } } /// /// 得到某一个已经显示的面板 方便外部使用 /// public T GetPanel(string name) where T:BasePanel { if (panelDic.ContainsKey(name)) return panelDic[name] as T; return null; } /// /// 给控件添加自定义事件监听 /// /// 控件对象 /// 事件类型 /// 事件的响应函数 public static void AddCustomEventListener(UIBehaviour control, EventTriggerType type, UnityAction callBack) { EventTrigger trigger = control.GetComponent(); if (trigger == null) trigger = control.gameObject.AddComponent(); EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = type; entry.callback.AddListener(callBack); trigger.triggers.Add(entry); } }