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