NGUI中深度depth和z轴关系的小试验
生活随笔
收集整理的這篇文章主要介紹了
NGUI中深度depth和z轴关系的小试验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| 問題源自一個帖子,因為上傳的圖比較多,就另開了這個貼寫下自己的試驗結果,原帖在下面鏈接中 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在最上面 圖片:11.jpg ? 現在在depth不變的前提下修改z軸的值。將0_Dark的z軸調為-100,則它離相機更近了,看上去應該擋住后面的兩個才對,但Game場景中三者的關系并沒有改變,也就是說雖然看上去0_Dark應該擋住后面的東西,但并沒有這樣,還是depth起作用,也就是feiben同學所說的“相同atlas其實是共用同一個Z軸深度”。 圖片:12.jpg 2,不同panel下,同一個atlas的不同sprite不受depth的控制,而受z軸控制。此時只需稍微調節下其中一個精靈的z軸就可以,比如0.1,就可以控制sprite的顯示 比如接著1中的圖,新建一個panel_B,將1_NGUI拖到里面,會看到它蓋住了0和2,現在調節depth不起作用,無論1_NGUI的depth調成多少,都不會改變它在最上面的狀態 圖片:21.jpg 現在調節下1_NGUI的z軸為0.1,則它到了最后面 圖片:22.jpg 而比如現在想把在panel_B中的1_NGUI重新顯示在0和2之間,能辦到么?經過試驗會發現無論怎么調三者的z軸,都不能將NGUI放到1和2之間,因為它們是一個圖集中的精靈,共用一個z軸深度 比如將0_Dark的z設為100,此時1_NGUI的z軸還是0.1,但1_NGUI重新跑到了最上面,而不是中間 圖片:23.jpg 再把Label的z設為-100,NGUI是被覆蓋了,但Dark也跟著跑到了上面,注意此時三者的空間位置,NGUI的確是在中間的,但還是被后面的Dark擋住了 圖片:24.jpg 你也許會感覺這是自找麻煩,沒事把同一個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的中間 圖片:31.jpg ? 不過如果認為為什么要這么麻煩呢,只需要在一個panel中調節就可以了,那就回到了2中的問題上,總是在上或在下,而不會在中間 ? 如下圖,三者在一個panel下,現在空間位置是wooden在中間z為0,Dark為100,Lable為-100,且三者的depth也是相應的,但wooden還是在最上面 圖片:32.jpg 現在修改下wooden的z軸,比如改為1,而Dark和Label的z不變,則wooden跑到了最后面,但就是不到中間去 圖片:33.jpg 此外,即使用兩個panel,但同是SiFi圖集中的Dark和Label還是在同一個panel下,而把wooden放到另一個panel中,還是無法達到插入的目的,如下圖,無論怎么調節wooden的z軸,它要么在最前面,要么在最后面 圖片:34.jpg 此時只需把Dark或Label之一放到wooden的panel下就能實現wooden在中間的目的,比如把Dark和wooden放到一起 圖片:35.jpg 而現在有個有趣的想法,就是既然這樣可以達到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的問題。 |
最新喜歡:shawn.... bafa52... 257073... lm1010... lvmeng... 告別永恒 wuyang... itpont... hong20... qxz 回復 |
wangyel1 學者
| 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條一樣。 圖片:a1.jpg 此外對于將文字打包到Atlas中,是在制作字體是,在FontMaker中選擇目標Atlas,此時就會將文字打包到了此Atlas中。不過要注意,這個操作會修改Atlas,所以不要弄錯了 如下圖,就是將官方的Arimo14字體打包到了DiShuTest圖集中,也就是在Output選項中選擇Atlas。而or select這項中的字體會被替換掉,可以不選,當然Atlas在不打包字體的時候也可以不選 圖片:font.jpg 而對于中文,文字因為不能像英文那樣用單個的字母來組成,所以為了能顯示大多數的常用字,一般都是用單獨的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,但它卻顯示在了最上面。 圖片:m1.jpg 現在用z軸控制他們的顯示順序和depth一樣,很容易就做到了。 圖片:m2.jpg 這些試驗都是在比較簡單的情況下做的,所以可能并不真的對,所以如果有錯誤的地方請指出。 ? ? ? |
| 回復(0) 喜歡(2) ????評分 |
aleraler 學徒
| 2樓# 發布于:2013-02-08 09:03 再加上字體,有時NGUI的atlas 、depth、 Z軸想要調出你想要的界 |
轉載于:https://www.cnblogs.com/sy88/p/3445516.html
總結
以上是生活随笔為你收集整理的NGUI中深度depth和z轴关系的小试验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 申请灵活就业社保的流程 分以下两点
- 下一篇: 沃特股份是做什么的