其实上面的东西总结出来就一句话:(啰嗦那么多,总结却这么少,好没成就感,呵呵)
在相同Panel下,相同Atlas中的Sprite才受Depth控制,其他情况则受z轴控制,但同时又受前者影响。
列个表的话就是:
1、相同panel 相同atlas sprite受depth控制
2、相同panel 不同atlas sprite受z轴控制 (同时受1的影响)
3、不同panel 相同atlas sprite受z轴控制 (同时受1的影响)
4、不同panel 不同atlas sprite受z轴控制 (同时受1的影响)
不过要特别注意的是,虽然depth控制的范围看似较少,但它却占主导地位,是最常被用到的,这是因为NGUI基于Atlas,只有在1无法达到目的的时候,才会去用其他的。 而且在较复杂的情况时它也是易被忽略的,也就是2、3、4括号中的“同时受1的影响”。比如在2中,相同panel下,有三个sprite:A、B、C,但A和B的Atlas是相同的,C是的Atlas是另一个,此时即使用z轴控制,也无法将C放到AB之间,这也是上楼中3中所提到的问题。
此外关于字体,感觉要分两方面,一个是英语等外语,一个是中文。
对于英文,因为就那些有限的字母(因为只会点英语,所以不知道是不是有的外语制作起来也很繁杂),所以可以和图片sprite放到一起,官方的atlas中就是这样的分布,把字体和图片打包在了一起。这种情况下我感觉字体和图片是在同一个atlas里面的,使用起来也只是占1个drawcall。而同一个atlas中的sprite,则可用depth来调整深度。比如上面1234例子里的Label就是英文字体,它是和Dark这个图片同在SiFi图集中,所以在相同panel下可用depth来控制显示顺序。但此时想再插入一个其他atlas中的sprite到他俩之间的话,就会不成功,因为他俩是一个atlas中的。
而不同的panel下就只能用z轴来控制了。比如用SiFi的Label,此外再用wooden图集的button,他俩只用depth是没法控制的。如下图中,后缀表示label的depth是10,而button的depth是0,但button还是挡住了label,这和上面说的第4条一样。
此外对于将文字打包到Atlas中,是在制作字体是,在FontMaker中选择目标Atlas,此时就会将文字打包到了此Atlas中。不过要注意,这个操作会修改Atlas,所以不要弄错了
如下图,就是将官方的Arimo14字体打包到了DiShuTest图集中,也就是在Output选项中选择Atlas。而or select这项中的字体会被替换掉,可以不选,当然Atlas在不打包字体的时候也可以不选
而对于中文,文字因为不能像英文那样用单个的字母来组成,所以为了能显示大多数的常用字,一般都是用单独的UIFont来制作,可看做是一个atlas,这种情况下,字体的atlas和其他的atlas就是在不同的图集了。此时可用z轴来控制。
比如下图中,用了3个Atlas,都放到同一个panel下,后缀表示的depth,注意左边的那4个是参照,只为了能看清都是那些东西。分别是:
Atlas1,使用一个sprite,人物为程咬金,depth为3
Atlas2,实际是一个中文Font字体的label,也看做是图集,depth是2
Atlas3,最后两个精灵都是用的Sift中的,depth是0和1
然后把它们都放到一个panel下,而你做试验的时候可能显示的顺序不一样,但不要紧,我们关注的是它们是不是以depth的顺序排列了,而看一下就知道,它们并没按顺序排列,比如NGUI的depth是1,但它却显示在了最上面。
现在用z轴控制他们的显示顺序和depth一样,很容易就做到了。
这些试验都是在比较简单的情况下做的,所以可能并不真的对,所以如果有错误的地方请指出。
多panel分层是我最开始使用的方法,关于你后来提到的,平行的多panel,我实测过是没有增加更多的drawcall的,但相比还是不如'Depth Pass'少,所以我后来采用的Depth Pass(整个结构只有一个panel,在panel上有个选项,选中他),而且一个panel的话相对好控制。
但是,多panel解决不了我之前提出的问题,我之前的游戏对象是要放在滚动条里的,panel下的子panel是没有被剪切的。目前我想到的解决方案有2个:
第1个是不使用DepthPass,将本来的2个atlas分成3个,再通过z轴控制深度(还好我目前只用到2个atlas),大不了复用的图片两个atlas中都有,然后字体的atlas也多复制一个(我在上层和下层都有字体)(关于字体我还有个疑问没测试明白,稍后提出);
第2个方案,还是使用DepthPass,由于panel滚动条显示的问题(我跟官方联系过,答复是‘Depth pass shader is not supposed to be used for clipped panels’),不使用panel滚动条,换用例子里另外一个摄像机滚动条,我测试过是正常的,而且深度显示也正常。
我的结论(欢迎大侠指正): 关于深度,如果所有atlas来自游戏内部,建议用DepthPass,如果中间层的那个图标是从网络下载得到的,我想用多panel分层应该会好些。这个不是绝对的,还是需要灵活运用,有些本身不会有穿插的比如说大背景图,就单提出来放在一个panel里,把有穿插的放在一个DepthPass的panel里。等等,情况很多。
现在 再提出一个问题 ,上面提到的字体。经过实测,如果只有1个图片atlas和字体atlas的话,他们是可以通过调整Depth穿插深度的,就是说图片精灵可
以插在两段文字中间,但是如果再多一个atlas,深度就乱了。为什么图片和字体可以穿插,图片和图片却不能穿插,为什么多了一个atlas之后字体也不能穿插了。我尝试看了下源代码,没找到门路。请大侠指点下这个是什么原因。