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;

最新文章

  1. 安卓Design包下的TextInputLayout和FloatingActionButton的简单使用
  2. MySQL 视图
  3. 公用表表达式(CTE)递归的生成帮助数据
  4. GetRelevantAnimTimeRemainingFraction节点Bug
  5. dede的安装和配置
  6. iphone 3gs 美版,6.1.3+降基带+越狱+解锁。成功分享(转)
  7. iOS 设置 文字和 图片的位置
  8. MySQL记录操作
  9. 客户端获取服务端自定义类数据 z
  10. [Ruby01]Class, Module, Object,Kernel的关系
  11. ArcEngine 图层无闪烁刷新
  12. python第一天(文件流以及控制流)简单总结
  13. webAppbuilder微件使用教程3 地理处理微件
  14. jquery表单验证源码
  15. The content of elements must consist of well-formed character data or markup
  16. python接口自动化-传 json 参数
  17. java编程高级进阶
  18. 侧边栏收起展开效果,onmouseover,onmouseout
  19. Vue之组件使用(二)
  20. 使用powerdesigner连接MySQL并设置逆向工程图文教程

热门文章

  1. ubuntu使用抓包工具,charles
  2. widerface---VOC
  3. hive的排序,分組练习
  4. 最长绝对文件路径——算法面试刷题1(google),字符串处理,使用tree遍历dfs类似思路
  5. 第二课 ---git时光穿梭(版本回退)
  6. springboot学习小记
  7. Linux的常识
  8. MySQL的一些指令操作[简版]
  9. Windows操作系统下搭建Git服务器和客户端。
  10. Applet