using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; using XFramework; public class UIManager { /// /// 存储所有的UI以及UI对应的GameObject /// key为路径 /// private Dictionary dictUI; /// /// 存储所有的UI以及UI对应的BasePanel /// key为路径 /// private Dictionary dictPanel; /// /// 管理UI的栈 /// private Stack panelStack; /// /// 画布的名称 /// private string canvasName; /// /// 画布对象 /// private GameObject canvasObj; /// /// 面板管理器 /// /// 画布名称 public UIManager(string name = "Canvas") { dictUI = new Dictionary(); dictPanel = new Dictionary(); panelStack = new Stack(); canvasName = name; canvasObj = GameObject.Find(canvasName); } /// /// 初始化画布缩放设置 /// /// public void InitCanvasScaler(CanvasScaler.ScaleMode scaleMode, Vector2 adaptScreenSize,float matchWOH) { if (canvasObj) { CanvasScaler canvasScaler = canvasObj.GetComponent(); canvasScaler.uiScaleMode = scaleMode; canvasScaler.referenceResolution = adaptScreenSize; canvasScaler.matchWidthOrHeight = matchWOH; } } /// /// 获取一个UI对象 /// /// UI类型 /// private GameObject GetSingleUI(UIType ui) { if (dictUI.ContainsKey(ui.Name)) { ui.Init = true; return dictUI[ui.Name]; } if (canvasObj == null) { canvasObj = GameObject.Find(canvasName); if (canvasObj == null) { Debug.LogError($"名为{canvasName}的画布不存在"); return null; } } GameObject obj = GameObject.Instantiate(Resources.Load(ui.Path), canvasObj.transform); obj.name = ui.Name; dictUI.Add(ui.Name, obj); return obj; } /// /// 移除UI /// /// /// 是否销毁,不销毁即隐藏 public void DestroyUI(UIType ui, bool isDestroy = false) { if (dictUI.ContainsKey(ui.Name)) { if (isDestroy) { GameObject.Destroy(dictUI[ui.Name]); dictUI.Remove(ui.Name); dictPanel.Remove(ui.Name); } else { dictUI[ui.Name].transform.PanelAppearance(false); } } } /// /// 加入一个新面板 /// /// public BasePanel Push(BasePanel newPanel) { if (panelStack.Count > 0) panelStack.Peek().OnDisable();//显示新面板时屏蔽下层面板 if (!dictPanel.ContainsKey(newPanel.UI.Name)) { dictPanel.Add(newPanel.UI.Name, newPanel); GameObject obj = GetSingleUI(newPanel.UI); newPanel.ActivePanel = obj.transform; newPanel.Initializa(this); } else { BasePanel p = dictPanel[newPanel.UI.Name]; newPanel = p; } newPanel.OnStart(); if (panelStack.Count > 0) { //防止连续推送重复的面板 if (panelStack.Peek().UI.Name != newPanel.UI.Name) panelStack.Push(newPanel); } else panelStack.Push(newPanel); return newPanel; } /// /// 移除最上层面板 /// public void Pop() { if (panelStack.Count > 0) panelStack.Pop().OnDestroy(); if (panelStack.Count > 0) panelStack.Peek().OnEnable(); } /// /// 移除所有面板 场景跳转或所有UI需要重新加载时调用 /// public void PopAll() { var values = dictPanel.Values.ToList(); while (values.Count > 0) { values[0].OnDestroy(true); values.RemoveAt(0); } } /// /// 获取当前显示的面板 /// public BasePanel GetActivePanel() { if (panelStack.Count == 0) return null; return panelStack.Peek(); } /// /// 更新当前显示的面板 /// public void ChangePanel(object data) { if (panelStack.Count == 0) return; panelStack.Peek().Change(data); } /// /// 更新当前显示的面板 /// public void ChangePanel( float data) { if (panelStack.Count == 0) return; panelStack.Peek().Change(data); } /// /// 更新当前显示的面板 /// public void ChangePanel(string msgType,object value) { if (panelStack.Count == 0) return; panelStack.Peek().Change(msgType,value); } //在当前UI上显示提示文字 public void ShowPromptText(string promprMsg,Color textColor) { if (panelStack.Count == 0) return; panelStack.Peek().ShowPromoptText(promprMsg, textColor,Vector2.zero); } /// /// 更新指定面板面板 /// public void ChangeOnePanel(string panelName,object data) { if (!dictPanel.ContainsKey(panelName)) return; dictPanel[panelName].Change(data); } }