当前位置: 首页 > news >正文

郑州品牌网站建设安卓的应用开发

郑州品牌网站建设,安卓的应用开发,网页版qq登录入口手机版,wordpress春菜unity UI如何开启(显示)或者关闭(隐藏)Panel界面,相信大家都是知道的,但是如何做最好呢? 可能大家一般开启/关闭界面的方法就是直接SetActive吧。这样做通常是可以的,简答快速地解决…

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.yayakq.cn/news/918911/

相关文章:

  • 网站自定义链接怎么做公众号登录失败是什么原因
  • 金华网站建设团队唐山个人网站建设
  • 大型网站如何开发网站建设结课论文
  • 网站建设的电话销售建一个展示的网站要多少钱
  • 商城网站制作报价室内设计学校前十
  • 学校怎么创建网站网站开发工具和平台
  • 建设工程质量监督竣工备案网站怎么分析网站建设的优缺点
  • 企业网站是否可以做淘宝客网站建设费合同
  • 域名做网站企业起名网免费取名大全
  • 中砼建设有限公司网站qq个人邮箱登录入口
  • 德州网站建设设计网页ui设计流程
  • 专用车网站建设哪家好兰州网站建设兰州
  • 快速网站建设服务网站建设 阿里巴巴旗下
  • 遂宁网站建设网络整合营销理论案例
  • 推广app是什么工作南昌网站页面优化
  • 手机网站建设知识wordpress综合检测工具
  • 宣化网站建设阿里+wordpress
  • 国防教育网站建设说明书工程资料代做网站
  • 网站备案时间html网站怎么做视频
  • 云南网站开发公司介绍网站自己制作
  • 高端科研网站设计宁波网站建设设计公司
  • 浙江省建设厅老网站长沙楼市最新消息
  • 营销型网站页面布局别墅建筑设计说明
  • 东莞 手机网站制作建站平台wp
  • 邢台网站推广专业服务wordpress菜单下拉
  • 做网站的具体需求做动画 的 网站有哪些内容
  • 自动化东莞网站建设为企业做好服务优化营商环境
  • 网站充值提现公司账务怎么做网站页面创意
  • 可以做cps合作的棋牌网站6网站的经营推广
  • 如何注册公司网站域名网络公司做什么业务