问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖在下面链接中
http://game.ceeger.com/forum/read.php?tid=8911#info NGUI中是用depth来控制sprite显示顺序的,本来这很好用,但碰到上面帖子中的问题时却不好解决了,于是我试验了下。以下是一些总结,不对的地方请指正。 下面的内容可能看起来比较绕,这样的话只需实际试验下就能很容易的知道结果,呵呵 如果还是看不明白,可以先看1楼,那里有个总结 1,同一个panel下,同一个atlas的不同sprite的显示只受depth的控制,这是最经常用的方式。此时不论精灵的z轴如何变化,depth高的一定在前面。 比如精灵A的z轴是-10,更靠近相机,但它的depth是0,而精灵B的z轴是0但depth是1,那么精灵B还是显示在前面 如下图,0、1、2的前缀分别是三者的depth值,则三者的排列就是如图的由下到上,2_Label在最上面 现在在depth不变的前提下修改z轴的值。将0_Dark的z轴调为-100,则它离相机更近了,看上去应该挡住后面的两个才对,但Game场景中三者的关系并没有改变,也就是说虽然看上去0_Dark应该挡住后面的东西,但并没有这样,还是depth起作用,也就是feiben同学所说的“相同atlas其实是共用同一个Z轴深度”。 2,不同panel下,同一个atlas的不同sprite不受depth的控制,而受z轴控制。此时只需稍微调节下其中一个精灵的z轴就可以,比如0.1,就可以控制sprite的显示 比如接着1中的图,新建一个panel_B,将1_NGUI拖到里面,会看到它盖住了0和2,现在调节depth不起作用,无论1_NGUI的depth调成多少,都不会改变它在最上面的状态 现在调节下1_NGUI的z轴为0.1,则它到了最后面 而比如现在想把在panel_B中的1_NGUI重新显示在0和2之间,能办到么?经过试验会发现无论怎么调三者的z轴,都不能将NGUI放到1和2之间,因为它们是一个图集中的精灵,共用一个z轴深度 比如将0_Dark的z设为100,此时1_NGUI的z轴还是0.1,但1_NGUI重新跑到了最上面,而不是中间 再把Label的z设为-100,NGUI是被覆盖了,但Dark也跟着跑到了上面,注意此时三者的空间位置,NGUI的确是在中间的,但还是被后面的Dark挡住了 你也许会感觉这是自找麻烦,没事把同一个atlas的精灵放到两个panel中干什么呢?一般情况下是自找麻烦,但为了解决上面帖子中提到的问题,这是个解决的办法,如3 3,不同panel下,不同atlas的精灵的穿插,受z轴的控制。 现在回到帖子中提出的问题,怎么让多个atlas的sprite能进行穿插。办法是用多个panel。 比如有两个atlas,分别为SiFi和Wooden,而SiFi中有两个要显示的精灵Dark和Label,Wooden中有一个要显示的精灵wooden,现在想把wooden放到Dark和Label之间。那么设置两个panel,一个放Dark和wooden,另一个放Label,或者一个放Label和wooden,另一个放Dark,只要SiFi图集中的两个精灵不在同一个panel中就可以,之后微调其中一个精灵的z轴就可以了,比如调节Label的z轴为-0.1,则如下图,wooden到了Dark和Label的中间 不过如果认为为什么要这么麻烦呢,只需要在一个panel中调节就可以了,那就回到了2中的问题上,总是在上或在下,而不会在中间 如下图,三者在一个panel下,现在空间位置是wooden在中间z为0,Dark为100,Lable为-100,且三者的depth也是相应的,但wooden还是在最上面 现在修改下wooden的z轴,比如改为1,而Dark和Label的z不变,则wooden跑到了最后面,但就是不到中间去 此外,即使用两个panel,但同是SiFi图集中的Dark和Label还是在同一个panel下,而把wooden放到另一个panel中,还是无法达到插入的目的,如下图,无论怎么调节wooden的z轴,它要么在最前面,要么在最后面 此时只需把Dark或Label之一放到wooden的panel下就能实现wooden在中间的目的,比如把Dark和wooden放到一起 而现在有个有趣的想法,就是既然这样可以达到wooden在中间的目的,那能不能把label放到两者中间呢?试一下就知道,是可以的。 而既然这样,那Dark能放到两者中间么,试一下,还是可以的 。这就让定位更加灵活 当然这是最简单的穿插,如果有多个panel和多个atlas的话情况会比较复杂,此时要记着2中的情况,否则还是容易出现无法穿插的问题。而解决这个问题的方法最好还是atlas设计的时候更全面,让穿插的sprite在一个atlas中,这样只用depth深度就可以控制了 4,同一个panel下,不同Atlas的sprite,受z轴控制,depth不起作用。而默认添加的时候覆盖关系似乎和atlas有关,比如从SiFi图集和Wooden图集中分别添加任意一个精灵到同一个panel下,总是SiFi的精灵在下面,此时depth不起作用,可以直接调节z轴比如-0.1就可以 5,(修改)对于panel是否会产生drawcall,之前的试验存在误区,当时是直接复制带着sprite的Panel,这的确会产生新的drawcall,这是因为在复制时panel的scale被修改了,由1变成了0.9999304之类的,这会导致drawcall增加了1个,而之后再复制这个由复制产生的panel,scale还是0.9999304,所以drawcall不会再变。 现在发现修改panel的缩放scale的确会增加drawcall。所以如果为了方便而复制一个panel的话,别忘了reset它的缩放 而之所以对panel是否会产生drawcall,是因为官方例7中只用了2个Atlas,但drawcall却是5个,当时简单的认为是panel的问题。 |
|
1楼#
发布于:2013-02-08 00:55
其实上面的东西总结出来就一句话:(啰嗦那么多,总结却这么少,好没成就感,呵呵)
在相同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一样,很容易就做到了。 这些试验都是在比较简单的情况下做的,所以可能并不真的对,所以如果有错误的地方请指出。 |