UI管理器的使用

解释

UIMgr 类是一个 UI 管理器,用于管理游戏中的所有 UI 面板。它使用了层级划分,使得不同类型的面板(底层、中层、高层和系统层)能够有条理地进行管理。以下是这个管理器的主要功能和方法,以及一个详细的使用案例

主要功能:

  1. 面板层级管理

    • 使用枚举 E_UILayer 划分面板的层级,确保 UI 的组织和显示顺序。
  2. 面板显示和隐藏

    • ShowPanel<T>:显示指定类型的面板。如果面板已加载,直接显示;如果未加载,异步加载并显示。
    • HidePanel<T>:隐藏指定类型的面板,可以选择是否销毁。
  3. 面板获取

    • GetPanel<T>:获取指定类型的面板,支持在面板加载中进行回调。
  4. 自定义事件添加

    • AddCustomEventListener:为 UI 控件添加自定义事件监听器,以响应特定的 UI 事件。

代码详细解释:

  1. 构造函数

    • 在构造函数中动态创建了 UI 摄像机、Canvas 和 EventSystem,确保这些组件在场景中唯一并能在场景切换时不被销毁。
  2. 面板管理

    • 使用字典 panelDic 存储面板信息,包含面板实例和回调函数。
  3. 显示面板 ShowPanel

    • 根据面板类型加载并显示相应的面板,支持异步加载和回调。
  4. 隐藏面板 HidePanel

    • 根据需要隐藏或销毁面板,更新面板的状态信息。
  5. 获取面板 GetPanel

    • 允许外部在面板加载完成后获取面板实例,并执行回调。
  6. 添加事件 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();
}
}

使用每个公有方法:

  1. ShowPanel<T>:在 MainMenu 类中展示设置面板。
  2. HidePanel<T>:在 SettingsPanel 类中处理关闭按钮点击时隐藏面板。
  3. GetPanel<T>:可以在 MainMenu 中获取面板实例(未在此示例中直接用到,但可以扩展)。
  4. AddCustomEventListener:可以为 UI 控件添加自定义事件,例如添加鼠标悬停效果等(未在示例中直接用到,但可以扩展)。

这个案例展示了如何使用 UIMgr 管理 UI 面板,如何将其与其他组件连接并实现简单的交互逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902186.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse与各种组件的关系

ClickHouse和其他组件关系如下&#xff1a; Flink支持ClickHouse Sink支持Hive/SparkSQL数据批量导入ClickHouseHetuEngine支持ClickHouse数据源常用第三方工具如DBeaver支持ClickHouse对接ClickHouse依赖ZooKeeper实现了分布式DDL执行以及ReplicatedMergeTree表主备节点之间的…

多线程—— JUC 的常见类

目录 前言 一、Callable 接口 1.Callable 介绍 2.代码示例 3.创建线程的方式 二、ReentrantLock 类 1.ReentrantLock 介绍 2.代码示例 3.与 synchronized 的区别 三、信号量 Semaphore 类 1.Semaphore 介绍 2.代码示例 3.保证线程安全的方式 四、CountDownLatch …

二、Spring的执行流程

文章目录 1. spring的初始化过程1.1 ClassPathXmlApplicationContext的构造方法1.2 refresh方法&#xff08;核心流程&#xff09;1.2.1 prepareRefresh() 方法1.2.2 obtainFreshBeanFactory() 方法1.2.3 prepareBeanFactory() 方法1.2.4 invokeBeanFactoryPostProcessors() 方…

(linux驱动学习 - 12). IIC 驱动实验

目录 一.IIC 总线驱动相关结构体与函数 1.i2c_adapter 结构体 2.i2c_algorithm 结构体 3.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_adapter 4.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_numbered_adapter 5.删除 I2C 适配器 - i2c_del_adapter 二.IIC 设…

【C++算法】11.滑动窗口_最大连续1的个数lll

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 1004. 最大连续 1 的个数 III 题目描述&#xff1a; 解法 解法一&#xff1a;暴力枚举zero计数器 转化找出最长的子数组&#xff0c;0的个数不超过k个。 例如&#xf…

计算机网络——有连接传输层协议TCP

序号 序号一般不从0开始&#xff0c;这个在双方建立连接后约定一个数 这样做可以避免网络中滞留的TCP段对新的连接的干扰

Flutter状态管理

StatefulWidget按状态划分StatelessWidgetStatefulWidget 按照作用域划分组件内私有状态实现跨组件状态管理全局状态 状态组件的组成 DataTableInheritedWidget生命周期无状态组件有状态组件initState()didChangeDependencies()build()setState()didUpdateWidget()deactivate()…

Redis 集群 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 集群 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 集群 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 集群…

二十二、Python基础语法(模块)

模块(module)&#xff1a;在python中&#xff0c;每个代码文件就是一个模块&#xff0c;在模块中定义的变量、函数、类别人都可以直接使用&#xff0c;如果想要使用别人写好的模块&#xff0c;就必须先导入别人的模块&#xff0c;模块名须满足标识符规则&#xff08;由字母、数…

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上&#xff0c;华为原生鸿蒙 HarmonyOS NEXT&#xff08;5.0&#xff09;正式发布。 华为官方透露&#xff0c;截至目前&#xff0c;鸿蒙操作系统在中国市场份额占据 Top2 的领先地位&#xff0c;拥有超过 1.1 亿 的代码行和 6…

布隆过滤器:极简存储,高效检索

引言 在海量数据的存储与检索中&#xff0c;如何在保持快速检索的同时&#xff0c;降低内存占用是个巨大的挑战。有没有一种既能快速检索又能节省内存的方案&#xff1f;布隆过滤器&#xff08;Bloom Filter&#xff09;就是这样一种数据结构。 布隆过滤器的基本原理 如果我…

Vue.js 学习总结(11)—— Vue3 Hook 函数实战总结

前言 在 Vue 3 中&#xff0c;Hook 函数是一种特殊的函数&#xff0c;用于封装可重用的逻辑和状态管理。Hook 函数允许你在 Vue 组件中提取和复用逻辑&#xff0c;而不是将所有逻辑都放在组件的选项对象中。它们可以帮助你更好地组织代码&#xff0c;提高代码的可维护性和可测…

算法题总结(十九)——图论

图论 DFS框架 void dfs(参数) { if (终止条件) {存放结果;return; }for (选择&#xff1a;本节点所连接的其他节点) {处理节点;dfs(图&#xff0c;选择的节点); // 递归回溯&#xff0c;撤销处理结果 } }深搜三部曲 确认递归函数&#xff0c;参数确认终止条件处理目前搜索节…

JAVA基础:IO流 (学习笔记)

IO流 一&#xff0c;IO流的理解 i &#xff1a; input 输入 o&#xff1a;output 输入 流&#xff1a;方式&#xff0c;传递数据的方式---------相当于生活中的“管道”&#xff0c;“车”&#xff0c;将资源从一个位置&#xff0c;传递到另一个位置 二&#xff0c;IO流的分…

从0开始深度学习(16)——暂退法(Dropout)

上一章的过拟合是由于数据不足导致的&#xff0c;但如果我们有比特征多得多的样本&#xff0c;深度神经网络也有可能过拟合 1 扰动的稳健性 经典泛化理论认为&#xff0c;为了缩小训练和测试性能之间的差距&#xff0c;应该以简单的模型为目标&#xff0c;即模型以较小的维度的…

Qt中使用线程之QConcurrent

QConcurrent可以实现并发&#xff0c;好处是我们可以不用单独写一个类了&#xff0c;直接在类里面定义任务函数&#xff0c;然后使用QtConcurrent::run在单独的线程里执行一个任务 1、定义一个任务函数 2、定义1个QFutureWatcher的对象&#xff0c;使用QFutureWatcher来监测任…

新手直播方案

简介 新手直播方案 &#xff0c;低成本方案 手机/电脑 直接直播手机软件电脑直播手机采集卡麦电脑直播多摄像机 机位多路采集卡 多路麦加电脑&#xff08;高成本方案&#xff09; 直播推流方案 需要摄像头 方案一 &#xff1a;手机 电脑同步下载 网络摄像头 软件&#xff08…

【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略

【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议&#xff08;IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、Windows11开发环境搭建 二、Windows11关键新特性 三、Windows11设计指南 …

小程序开发实战:PDF转换为图片工具开发

目录 一、开发思路 1.1 申请微信小程序 1.2 编写后端接口 1.3 后端接口部署 1.4 微信小程序前端页面开发 1.5 运行效果 1.6 小程序部署上线 今天给大家分享小程序开发系列&#xff0c;PDF转换为图片工具的开发实战&#xff0c;感兴趣的朋友可以一起来学习一下&#xff01…

linux中级(NFS服务器)

NFS&#xff1a;用于在NNIX/Linux主机之间进行文件共享的协议 流程&#xff1a;首先服务端开启RPC服务&#xff0c;并开启111端口&#xff0c;服务器端启动NFS服务&#xff0c;并向RPC注册端口信息&#xff0c;客户端启动RPC&#xff0c;向服务器RPC服务请求NFS端口&#xff0…