解释
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 面板,如何将其与其他组件连接并实现简单的交互逻辑。