zoukankan      html  css  js  c++  java
  • unity UI如何开启(显示)或者关闭(隐藏)Panel界面最好?

    https://segmentfault.com/a/1190000012357091

    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;

  • 相关阅读:
    local 不能解析为127.0.0.1
    完全使用接口方式调用WCF 服务
    【人生】自己对于求职应聘的一些感受
    OO的经典例子
    剪刀、石头、布机器人比赛
    TextTree 文本资料收集轻量级工具
    两个代替重复输入的小工具
    桌面助手 Desktop Helper 自动帮你关闭指定的窗口
    磁盘可用空间平衡
    用C#制造可以继承的“枚举”
  • 原文地址:https://www.cnblogs.com/eiya/p/10206242.html
Copyright © 2011-2022 走看看