UGUI Panel的显示和隐藏优化

unity UI如何开启(显示)或者关闭(隐藏)Panel界面,相信大家都是知道的,但是如何做最好呢?

可能大家一般开启/关闭界面的方法就是直接SetActive吧。这样做通常是可以的,简答快速地解决需求,但是它又两个问题:
第一,Disable掉的物体上面的脚本也不运行了,而很多时候我们需要那个脚本运行。这样就不能用挂在自己身上脚本把自己SetActive(true)或者SetActive(false)。如果把自己的引用给另外一个脚本来对自己SetActive(true)或者SetActive(false),又会造成多余的耦合,并不符合OOP设计理念。
第二,Disable掉的物体,重新SetActive(true),会造成较大的性能消耗,如果此界面draw call较多,会有明显的延迟。

不用SetActive(true)/(false)之后,我们还有什么其他方法解决问题吗?

以下是大家可能想到的其他方法,它们也各有各的问题:

方法:Scale改为0,0,0,再改为1,1,1;
问题:改回后draw call加倍;大量垃圾回收;

方法:将界面移除Canvas这个父物体;
问题:改回后draw call加倍;大量垃圾回收;而且新增父物体增加额外引用耦合;

方法:放在Camera的某个culling层上;
问题:改回后draw call加倍;大量垃圾回收;只对screen space-camera有效;

方法:Canvas.enable = false;
问题:改回后延迟严重;而且不方便使用;

这些都不好,那你说,什么方法可行呢?

这个解决方法就是给Panel加一个CanvasGroup,上面提到的问题,在它身上都不会发生;

若要显示:

GetComponent<CanvasGroup>().alpha = 1;
GetComponent<CanvasGroup>().interactable = true;
GetComponent<CanvasGroup>().blocksRaycasts = true;

若要隐藏:

GetComponent<CanvasGroup>().alpha = 0;
GetComponent<CanvasGroup>().interactable = false;
GetComponent<CanvasGroup>().blocksRaycasts = false;

使用Profiler工具分析CanvasGroup组件

首先创建一个BasePanel脚本,通过CanvasGroup组件来实现UI面板的显示(OnEnter)和隐藏(OnExit)。这里的BasePanel相当于是UIPanel的基类了,这里我只是抽出了一部分,等以后有空了把简易的UI管理类也一起讲了。

[RequireComponent(typeof(CanvasGroup))]
public class BasePanel : MonoBehaviour
{private CanvasGroup m_CanvasGroup;private void Awake(){m_CanvasGroup = GetComponent<CanvasGroup>();}public void OnEnter(){m_CanvasGroup.alpha = 1;m_CanvasGroup.blocksRaycasts = true;}public void OnExit(){m_CanvasGroup.alpha = 0;m_CanvasGroup.blocksRaycasts = false;}
}


然后就创建一个测试脚本,用于比较CanvasGroup组件和使用SetAcive(true/false)的性能消耗。这边要引入命名空间UnityEngine.Profiling才可以使用性能检测,在需要性能测试的函数前后添加Profiler.BeginSample("展示的名字")和Profiler.EndSample()即可。这里为了明显展现性能消耗,开放了一个num变量来控制我们循环次数。

public class Main : MonoBehaviour
{public BasePanel panel;public int num;//public GameObject panelGo;private void Awake(){//panel = panelGo.GetComponent<BasePanel>();}private void Update(){Profiler.BeginSample("CanvasGroup");CanvasGroupFun();Profiler.EndSample();Profiler.BeginSample("SetActive");ActiveFun();Profiler.EndSample();}void CanvasGroupFun(){for (int i = 0; i < num; i++){panel.OnEnter();panel.OnExit();}}void ActiveFun(){for (int i = 0; i < num; i++){panel.gameObject.SetActive(true);panel.gameObject.SetActive(false);}}
}


将num设为100次结果如图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发环境和生产环境的区别

软件开发环境(Software Development Environment&#xff0c;SDE)是指在基本硬件和宿主软件的基础上&#xff0c;为支持系统软件和应用软件的工程化开发和维护而使用的一组软件&#xff0c;简称SDE。它由软件工具和环境集成机制构成&#xff0c;前者用以支持软件开发的相关过程…

【MATLAB】 RGB和YCbCr互转

前言 在视频、图像处理领域经常会遇到不同色域图像的转换&#xff0c;比如RGB、YUV、YCbCr色域间的转换&#xff0c;这里提供一组转换公式&#xff0c;供大家参考。 色彩模型 RGB RGB色彩模型是一种用于表示数字图像的颜色空间&#xff0c;其中"RGB"代表红色&…

排序算法--------计数排序

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

记录每日LeetCode 1276.不浪费原料的汉堡制作方案 Java实现

题目描述&#xff1a; 圣诞活动预热开始啦&#xff0c;汉堡店推出了全新的汉堡套餐。为了避免浪费原料&#xff0c;请你帮他们制定合适的制作计划。 给你两个整数 tomatoSlices 和 cheeseSlices&#xff0c;分别表示番茄片和奶酪片的数目。不同汉堡的原料搭配如下&#xff1a…

asp的故事

Active Server Pages&#xff08;ASP&#xff09;是一种由Microsoft公司开发的服务器端脚本技术&#xff0c;用于构建动态的Web应用程序。ASP的故事始于上世纪90年代初&#xff0c;是Web开发领域的一项关键技术。以下是ASP发展历程和相关开发者的一些关键时刻&#xff1a; ASP的…

【Unity】万人同屏高级篇, 自定义BRGdots合批渲染,海量物体目标搜索

博文介绍了最基本的实现原理&#xff0c;有些老板懒得折腾&#xff0c;所以特意熬了几个秃头的夜把RVO、BRG、GPU动画、海量物体目标搜索等高度封装成了开箱即用的插件。 划重点&#xff01;&#xff01;此方案是绕开Entities(ECS)&#xff0c;不用写一行ECS代码&#xff0c;现…

两人公开使用同一配方多年后一人申请了专利,另一人还可以使用吗

举个例子&#xff1a;A和B是同行对手&#xff0c;一种配方是10年前A和B同时在使用。但是当时大家都没有申请专利保护这个配方&#xff0c;导致流通在市场&#xff0c;公开化了。一直到现在A想把这个配方申请专利保护起来&#xff0c;请问这个专利A申请下来之后&#xff0c;B往后…

高质量的标书要求

标书是企业向招标单位提交的一种书面文件&#xff0c;用于竞标、投标或申请项目。高质量的标书对于赢得项目或合同至关重要。 一、内容完整性 高质量的标书要求首先要求内容完整&#xff0c;即要求标书内容覆盖面广&#xff0c;细节丰富&#xff0c;表述清晰。在编写标书时&a…

xtu oj 1377 Factorization

Factorization 题目描述 根据质因子唯一分解定理可知npk11pk22…pkmm&#xff0c;其中pi都是质数。我们定义f(n)m, 求g(a,b)∑biaf(i)。 输入 第一行是一个整数T(1≤T≤1000)&#xff0c;表示样例的个数。 以后每个样例占一行&#xff0c;为两个整数 a(2≤a≤b≤106)。 输出…

关于个人Git学习记录及相关

前言 可以看一下猴子都能懂的git入门&#xff0c;图文并茂不枯燥 猴子都能懂的git入门 学习东西还是建议尽可能的去看官方文档 权威且详细 官方文档 强烈建议看一下GitHub漫游指南及开源指北&#xff0c;可以对开源深入了解一下&#xff0c;打开新世界的大门&#xff01; …

【Jmeter、postman、python 三大主流技术如何操作数据库?】

前言 1、前言 只要是做测试工作的&#xff0c;必然会接触到数据库&#xff0c;数据库在工作中的主要应用场景包括但不限于以下&#xff1a; 功能测试中&#xff0c;涉及数据展示功能&#xff0c;需查库校验数据正确及完整性&#xff1b;例如商品搜索功能 自动化测试或性能测试…

【开源】基于JAVA的学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

Ubuntu20.04-设置合上盖子电脑不熄屏,不休眠等

1.配置文件 /etc/systemd/logind.conf 1.1 配置文件解析 输入命令 sudo nano /etc/systemd/logind.conf打开的文件内容 # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser G…

【深度学习目标检测】十一、基于深度学习的电网绝缘子缺陷识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

[EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 Dell Latitude-7400 处理器Intel Core i7-8665U已驱动内存16GB DDR4 RAM已驱动硬盘Toshiba KIOXIA 512GB SSD已驱动显卡Intel UHD 620 Graphics已驱动声卡Realtek ALC256已驱动有线网卡 无 无无线网卡蓝牙Intel Wireless-AC 9560已驱动 支持系统版本 maco…

【OAuth2】用户授权第三方应用,流程详解及模式

目录 一、讲述 1. 是什么 2. 工作流程 3. OAuth2的好处 二、协议流程 1. 应用场景 2. 实例 3. 安全体现 4. 角色 5. 认证流程 三、授权模式 1. 授权码模式 2. 简化(隐式)模式 3. 密码模式 4. 客户端模式 每篇一获 一、讲述 1. 是什么 OAuth&#xff08;开放授…

HttpURLConnection发送各种内容格式

通过java.net.HttpURLConnection类实现http post发送Content-Type为multipart/form-data的请求。 json处理使用com.fasterxml.jackson 图片压缩使用net.coobird.thumbnailator log使用org.slf4j 一些静态变量 private static final Charset charset StandardCharsets.UTF_8;…

【开源】基于Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

前端八股文(js篇)

一.强制类型转换规则 首先需要了解隐式转换所调用的函数。 当程序员显示调用Boolean&#xff08;value&#xff09;,Number&#xff08;value&#xff09;&#xff0c;String&#xff08;value&#xff09;完成的类型转换&#xff0c;叫做显示类型转换。 当通过new Boolean&…

Golang硬件控制:将软件力量扩展到物理世界

Golang硬件控制:将软件力量扩展到物理世界 2023-11-1728发布于吉林 版权 简介: Golang硬件控制:将软件力量扩展到物理世界 引言 在过去的几十年中,计算机科学和软件工程领域取得了巨大的发展和进步。现在,我们可以编写各种强大的软件应用程序来解决各种问题。然而,软…