解释
UIMgr
类是一个 UI 管理器,用于管理游戏中的所有 UI 面板。它使用了层级划分,使得不同类型的面板(底层、中层、高层和系统层)能够有条理地进行管理。以下是这个管理器的主要功能和方法,以及一个详细的使用案例
主要功能:
-
面板层级管理:
- 使用枚举
E_UILayer
划分面板的层级,确保 UI 的组织和显示顺序。
- 使用枚举
-
面板显示和隐藏:
ShowPanel<T>
:显示指定类型的面板。如果面板已加载,直接显示;如果未加载,异步加载并显示。HidePanel<T>
:隐藏指定类型的面板,可以选择是否销毁。
-
面板获取:
GetPanel<T>
:获取指定类型的面板,支持在面板加载中进行回调。
-
自定义事件添加:
AddCustomEventListener
:为 UI 控件添加自定义事件监听器,以响应特定的 UI 事件。
代码详细解释:
-
构造函数:
- 在构造函数中动态创建了 UI 摄像机、Canvas 和 EventSystem,确保这些组件在场景中唯一并能在场景切换时不被销毁。
-
面板管理:
- 使用字典
panelDic
存储面板信息,包含面板实例和回调函数。
- 使用字典
-
显示面板
ShowPanel
:- 根据面板类型加载并显示相应的面板,支持异步加载和回调。
-
隐藏面板
HidePanel
:- 根据需要隐藏或销毁面板,更新面板的状态信息。
-
获取面板
GetPanel
:- 允许外部在面板加载完成后获取面板实例,并执行回调。
-
添加事件
AddCustomEventListener
:- 允许为 UI 控件添加事件监听,确保每个控件只挂载一个事件触发器。
案例
假设我们要创建一个简单的游戏开始面板,使用 UIMgr
来管理其显示和隐藏。
1.创建开始面板类
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR;
public class BeginPanel : UIPanelBase
{
TextMeshProUGUI text1;
TextMeshProUGUI text2;
TextMeshProUGUI text3;
protected override void Awake()
{
base.Awake();
text1 = GetControl<TextMeshProUGUI>("Text1");
text2 = GetControl<TextMeshProUGUI>("Text2");
text3 = GetControl<TextMeshProUGUI>("Text3");
}
private void Start()
{
}
public override void ShowMe()
{
ResShow();
}
public override void HideMe()
{
}
private void ResShow()
{
MonoMgr.Instance.StartCoroutine(GradientDisplayAdd(text1));
MonoMgr.Instance.StartCoroutine(GradientDisplayAdd(text2));
MonoMgr.Instance.StartCoroutine(GradientDisplayAdd(text3));
}
private void ResHide()
{
MonoMgr.Instance.StartCoroutine(GradientDisplaySub(text1));
MonoMgr.Instance.StartCoroutine(GradientDisplaySub(text2));
MonoMgr.Instance.StartCoroutine(GradientDisplaySub(text3));
}
protected override void ClickBtn(string btnName)
{
switch (btnName)
{
case "btnBegin":
ResHide();
break;
case "btnSetting":
HideMe();
break;
case "btnQuit":
HideMe();
break;
default:
break;
}
}
protected virtual IEnumerator GradientDisplayAdd(TextMeshProUGUI text,UnityAction callBack=null)
{
currentColor = Color.white;
currentColor.a = 0;
text.color = currentColor;
while (true)
{
currentColor.a += 0.01f;
yield return new WaitForSeconds(0.01f);
text.color = currentColor;
if(text.color.a >= 1)
break;
}
callBack?.Invoke();
}
protected virtual IEnumerator GradientDisplaySub(TextMeshProUGUI text, UnityAction callBack = null)
{
currentColor = Color.white;
currentColor.a = 1;
text.color = currentColor;
while (true)
{
currentColor.a -= 0.01f;
yield return new WaitForSeconds(0.01f);
text.color = currentColor;
if (text.color.a <= 0)
break;
}
callBack?.Invoke();
}
}
使用每个公有方法:
ShowPanel<T>
:在MainMenu
类中展示设置面板。HidePanel<T>
:在SettingsPanel
类中处理关闭按钮点击时隐藏面板。GetPanel<T>
:可以在MainMenu
中获取面板实例(未在此示例中直接用到,但可以扩展)。AddCustomEventListener
:可以为 UI 控件添加自定义事件,例如添加鼠标悬停效果等(未在示例中直接用到,但可以扩展)。
这个案例展示了如何使用 UIMgr
管理 UI 面板,如何将其与其他组件连接并实现简单的交互逻辑。