UIManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class UIManager : SingletonMonoAutoBase1_DonDestoryOnLoad<UIManager>
{
private Transform rearmost;
public Transform Rearmost
{
get
{
if (rearmost == null)
rearmost = transform.Find("RearMost");
return rearmost;
}
}
private Transform rear;
public Transform Rear
{
get
{
if (rear == null)
rear = transform.Find("Rear");
return rear;
}
}
private Transform middle;
public Transform Middle
{
get
{
if (middle == null)
middle = transform.Find("Middle");
return middle;
}
}
private Transform front;
public Transform Front
{
get
{
if (front == null)
front = transform.Find("Front");
return front;
}
}
private Transform foreFront;
public Transform ForeFront
{
get
{
if (foreFront == null)
foreFront = transform.Find("ForeFront");
return foreFront;
}
}
//记录当前已经显示的面板
Dictionary<GameObject, GameObject> panelDistionary = new Dictionary<GameObject, GameObject>();
/// <summary>
/// 显示面板
/// </summary>
public void ShowPanel(GameObject panelPrefab,E_PanelDisplayLayer layer=E_PanelDisplayLayer.Middle)
{
if (panelPrefab==null)
{
Debug.LogWarning("显示失败,要显示的面板的预制体为null");
return;
}
//如果当前已经显示了该面板,则不重复显示了,而是直接返回
if (panelDistionary.ContainsKey(panelPrefab))
return;
GameObject panel = Instantiate(panelPrefab); //创建指定的面板物体
panel.name = panelPrefab.name; //给物体改名
panelDistionary.Add(panelPrefab, panel); //将该面板的信息记录到字典中
Transform parent = null; //记录该面板要放进哪个层中来显示
switch (layer)
{
case E_PanelDisplayLayer.Rearmost:
parent = Rearmost;
break;
case E_PanelDisplayLayer.Rear:
parent = Rear;
break;
case E_PanelDisplayLayer.Middle:
parent = Middle;
break;
case E_PanelDisplayLayer.Front:
parent = Front;
break;
case E_PanelDisplayLayer.ForeFront:
parent = ForeFront;
break;
default:
break;
}
panel.transform.SetParent(transform, false); //修正面板的位置
panel.transform.SetParent(parent); //在指定层显示该面板
}
public void HidePanel(GameObject panelPrefab)
{
if (panelPrefab == null)
{
Debug.LogWarning("显示失败,要隐藏的面板的预制体为null");
return;
}
//要隐藏的面板不存在
if (!panelDistionary.ContainsKey(panelPrefab)) return;
Destroy(panelDistionary[panelPrefab]); //销毁面板
panelDistionary.Remove(panelPrefab); //移除字典中该面板的信息
}
/// <summary>
/// 隐藏面板--重置方法
/// </summary>
public void HidePanel(string panelPrefabName)
{
foreach (var item in panelDistionary.Keys)
{
if (item.name == panelPrefabName)
{
HidePanel(item);
return;
}
}
return;
}
/// <summary>
/// 判断指定的面板是否显示了
/// </summary>
public bool IsPanelShowed(GameObject panelPrefab)
{
return panelDistionary.ContainsKey(panelPrefab);
}
/// <summary>
/// 判断指定的面板是否显示了
/// </summary>
public bool IsPanelShowed(string panelPrefabName)
{
foreach (var item in panelDistionary.Keys)
{
if (item.name == panelPrefabName)
{
return true;
}
}
return false;
}
private void Awake()
{
//创建画布
CreateOverlayCanvas();
//创建EventSystem
CreateEventSystem();
}
/// <summary>
/// 创建画布
/// </summary>
void CreateOverlayCanvas()
{
//改layer
gameObject.layer = LayerMask.NameToLayer("UI");
//添加并设置Canvas组件
Canvas canvas = gameObject.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.sortingOrder = 1000;
//添加并设置CanvasScaler组件
CanvasScaler canvasScaler = gameObject.AddComponent<CanvasScaler>();
canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
canvasScaler.referenceResolution = new Vector2(Screen.width, Screen.height);
canvasScaler.matchWidthOrHeight = Screen.width > Screen.height ? 1 : 0;
//添加并设置Graphic Raycaster 组件
GraphicRaycaster graphicRaycaster = gameObject.AddComponent<GraphicRaycaster>();
//添加子物体,作为显示的层的父物体
//Rearmost 层的父物体
GameObject rearmost = new GameObject("RearMost");
rearmost.transform.SetParent(transform,false);
//Rear 层的父物体
GameObject rear = new GameObject("Rear");
rear.transform.SetParent(transform, false);
//Middle 层的父物体
GameObject middle = new GameObject("Middle");
middle.transform.SetParent(transform, false);
//Front 层的父物体
GameObject front = new GameObject("Front");
front.transform.SetParent(transform, false);
//Frontmost 层的父物体
GameObject foreFront = new GameObject("ForeFront");
foreFront.transform.SetParent(transform, false);
}
/// <summary>
/// 创建EventSystem
/// </summary>
void CreateEventSystem()
{
//如果场景中已经存在该物体则不创建直接返回
if (FindObjectOfType<EventSystem>()) return;
GameObject eventSystem = new GameObject("EventSystem");
DontDestroyOnLoad(eventSystem);
eventSystem.AddComponent<EventSystem>();
eventSystem.AddComponent<StandaloneInputModule>();
}
}