[unity3D基础知识]NGUI中深度depth和z轴关系 (转载)

来源:互联网 发布:mac定制无瑕粉底液色号 编辑:程序博客网 时间:2024/04/30 05:19
问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖在下面链接中
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在中间z0Dark100Lable-100,且三者的depth也是相应的,但wooden还是在最上面
现在修改下woodenz轴,比如改为1,而DarkLabelz不变,则wooden跑到了最后面,但就是不到中间去

此外,即使用两个panel,但同是SiFi图集中的DarkLabel还是在同一个panel下,而把wooden放到另一个panel中,还是无法达到插入的目的,如下图,无论怎么调节woodenz轴,它要么在最前面,要么在最后面


此时只需把DarkLabel之一放到woodenpanel下就能实现wooden在中间的目的,比如把Darkwooden放到一起

而现在有个有趣的想法,就是既然这样可以达到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的问题。

原创粉丝点击