UI框架bug修复版

  • 发表于: 2023-08-31 22:44:05 来源:哔哩哔哩

上一次分享完UI框架之后,就经常有同学来问我问题,其中出现问题最多的就是打开某个界面时,显示:界面已打开。

为了方便大家使用,本着严谨的态度,在这里对原因进行分析,并且给出修改版的代码。


(资料图)

UGUI的界面是用Canvas(画布)进行布局的,对于不同Canvas,至少有两种办法可以调整其渲染的先后顺序:

使用Canvas属性中的Sort Order,数字越大,渲染优先级越高。

Canvas在Hierarchy中的顺序,越下方的渲染优先级越高。

按照这个思路,后打开的界面一定是叠加在之前界面的上层。

所以,当我打开:UserPanel,一切正常,他叠加在 MainMenuPanel 之上:

紧接着,我再打开:NewUserPanel,就不对劲了。

把MainMenuPanel隐藏掉,发现UserPanel跑到下方去了,很明显,此处UGUI的渲染层级并没有按照第二条规则进行:

2. Canvas在Hierarchy中的顺序,越下方的渲染优先级越高。

具体原因嘛,我还没找到,如果有同学知道,可以分享下,不是Unity出bug就是我出bug了。

解决方案:

既然第二种方法排序错乱,那么我们使用第一种方法不就好了:

1. 使用Canvas属性中的Sort Order,数字越大,渲染优先级越高。

核心代码就是在UIManager中记录当前最大的sortingLayer,

这样就确保每次新打开的界面永远在最上层了。

当然这只是提出一个思路,对于更复杂的项目还要考虑如下问题:1. sortingOrder会不会超出int的最大值

int的最大值为:21474836473,差不多打开过两百多亿个界面就超过了,嗯,相信你可以的!!!

实在不放心的话,可以在切场景的时候,重置sortingOrder为0就好了。

2. 有些界面我希望他始终位于最上层怎么办:

这里提供下思路,可以对UI再分几个大层,比如:

= 1

= 2

= 2

然后默认打开的界面都放在Canvas1下,需要处于比较高层级的就放在Canvas2下。

比如,这样:

具体代码我就不写了,反正思路是这么个思路,欢迎交流探讨~

源码:

关键词: