上一次分享完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下。
比如,这样:
具体代码我就不写了,反正思路是这么个思路,欢迎交流探讨~
源码: