天天看點

NGUI中深度depth和z軸關系的小試驗

http://blog.sina.com.cn/s/blog_4cf92e760101d2lb.html

問題源自一個文章,因為上傳的圖比較多,就另開了這個貼寫下自己的試驗結果,原帖在下面連結中

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在最上面

NGUI中深度depth和z軸關系的小試驗
現在在depth不變的前提下修改z軸的值。将0_Dark的z軸調為-100,則它離相機更近了,看上去應該擋住後面的兩個才對,但Game場景中三者的關系并沒有改變,也就是說雖然看上去0_Dark應該擋住後面的東西,但并沒有這樣,還是depth起作用,也就是feiben同學所說的“相同atlas其實是共用同一個Z軸深度”。
NGUI中深度depth和z軸關系的小試驗

2,不同panel下,同一個atlas的不同sprite不受depth的控制,而受z軸控制。此時隻需稍微調節下其中一個精靈的z軸就可以,比如0.1,就可以控制sprite的顯示

比如接着1中的圖,建立一個panel_B,将1_NGUI拖到裡面,會看到它蓋住了0和2,現在調節depth不起作用,無論1_NGUI的depth調成多少,都不會改變它在最上面的狀态

NGUI中深度depth和z軸關系的小試驗
現在調節下1_NGUI的z軸為0.1,則它到了最後面
NGUI中深度depth和z軸關系的小試驗

而比如現在想把在panel_B中的1_NGUI重新顯示在0和2之間,能辦到麼?經過試驗會發現無論怎麼調三者的z軸,都不能将NGUI放到1和2之間,因為它們是一個圖集中的精靈,共用一個z軸深度

比如将0_Dark的z設為100,此時1_NGUI的z軸還是0.1,但1_NGUI重新跑到了最上面,而不是中間

NGUI中深度depth和z軸關系的小試驗
再把Label的z設為-100,NGUI是被覆寫了,但Dark也跟着跑到了上面,注意此時三者的空間位置,NGUI的确是在中間的,但還是被後面的Dark擋住了
NGUI中深度depth和z軸關系的小試驗

你也許會感覺這是自找麻煩,沒事把同一個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的中間

NGUI中深度depth和z軸關系的小試驗

不過如果認為為什麼要這麼麻煩呢,隻需要在一個panel中調節就可以了,那就回到了2中的問題上,總是在上或在下,而不會在中間

如下圖,三者在一個panel下,現在空間位置是wooden在中間z為0,Dark為100,Lable為-100,且三者的depth也是相應的,但wooden還是在最上面

NGUI中深度depth和z軸關系的小試驗
現在修改下wooden的z軸,比如改為1,而Dark和Label的z不變,則wooden跑到了最後面,但就是不到中間去
NGUI中深度depth和z軸關系的小試驗
此外,即使用兩個panel,但同是SiFi圖集中的Dark和Label還是在同一個panel下,而把wooden放到另一個panel中,還是無法達到插入的目的,如下圖,無論怎麼調節wooden的z軸,它要麼在最前面,要麼在最後面
NGUI中深度depth和z軸關系的小試驗
此時隻需把Dark或Label之一放到wooden的panel下就能實作wooden在中間的目的,比如把Dark和wooden放到一起
NGUI中深度depth和z軸關系的小試驗

而現在有個有趣的想法,就是既然這樣可以達到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的問題。

  • NGUI中深度depth和z軸關系的小試驗
  • NGUI中深度depth和z軸關系的小試驗
  • NGUI中深度depth和z軸關系的小試驗
7

=================================================================================================================================================================================================================

其實上面的東西總結出來就一句話:(啰嗦那麼多,總結卻這麼少,好沒成就感,呵呵)

在相同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條一樣。

NGUI中深度depth和z軸關系的小試驗

此外對于将文字打包到Atlas中,是在制作字型是,在FontMaker中選擇目标Atlas,此時就會将文字打包到了此Atlas中。不過要注意,這個操作會修改Atlas,是以不要弄錯了

如下圖,就是将官方的Arimo14字型打包到了DiShuTest圖集中,也就是在Output選項中選擇Atlas。而or select這項中的字型會被替換掉,可以不選,當然Atlas在不打包字型的時候也可以不選

NGUI中深度depth和z軸關系的小試驗

而對于中文,文字因為不能像英文那樣用單個的字母來組成,是以為了能顯示大多數的常用字,一般都是用單獨的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,但它卻顯示在了最上面。

NGUI中深度depth和z軸關系的小試驗

現在用z軸控制他們的顯示順序和depth一樣,很容易就做到了。

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在最上面

NGUI中深度depth和z軸關系的小試驗
現在在depth不變的前提下修改z軸的值。将0_Dark的z軸調為-100,則它離相機更近了,看上去應該擋住後面的兩個才對,但Game場景中三者的關系并沒有改變,也就是說雖然看上去0_Dark應該擋住後面的東西,但并沒有這樣,還是depth起作用,也就是feiben同學所說的“相同atlas其實是共用同一個Z軸深度”。
NGUI中深度depth和z軸關系的小試驗

2,不同panel下,同一個atlas的不同sprite不受depth的控制,而受z軸控制。此時隻需稍微調節下其中一個精靈的z軸就可以,比如0.1,就可以控制sprite的顯示

比如接着1中的圖,建立一個panel_B,将1_NGUI拖到裡面,會看到它蓋住了0和2,現在調節depth不起作用,無論1_NGUI的depth調成多少,都不會改變它在最上面的狀态

NGUI中深度depth和z軸關系的小試驗
現在調節下1_NGUI的z軸為0.1,則它到了最後面
NGUI中深度depth和z軸關系的小試驗

而比如現在想把在panel_B中的1_NGUI重新顯示在0和2之間,能辦到麼?經過試驗會發現無論怎麼調三者的z軸,都不能将NGUI放到1和2之間,因為它們是一個圖集中的精靈,共用一個z軸深度

比如将0_Dark的z設為100,此時1_NGUI的z軸還是0.1,但1_NGUI重新跑到了最上面,而不是中間

NGUI中深度depth和z軸關系的小試驗
再把Label的z設為-100,NGUI是被覆寫了,但Dark也跟着跑到了上面,注意此時三者的空間位置,NGUI的确是在中間的,但還是被後面的Dark擋住了
NGUI中深度depth和z軸關系的小試驗

你也許會感覺這是自找麻煩,沒事把同一個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的中間

NGUI中深度depth和z軸關系的小試驗

不過如果認為為什麼要這麼麻煩呢,隻需要在一個panel中調節就可以了,那就回到了2中的問題上,總是在上或在下,而不會在中間

如下圖,三者在一個panel下,現在空間位置是wooden在中間z為0,Dark為100,Lable為-100,且三者的depth也是相應的,但wooden還是在最上面

NGUI中深度depth和z軸關系的小試驗
現在修改下wooden的z軸,比如改為1,而Dark和Label的z不變,則wooden跑到了最後面,但就是不到中間去
NGUI中深度depth和z軸關系的小試驗
此外,即使用兩個panel,但同是SiFi圖集中的Dark和Label還是在同一個panel下,而把wooden放到另一個panel中,還是無法達到插入的目的,如下圖,無論怎麼調節wooden的z軸,它要麼在最前面,要麼在最後面
NGUI中深度depth和z軸關系的小試驗
此時隻需把Dark或Label之一放到wooden的panel下就能實作wooden在中間的目的,比如把Dark和wooden放到一起
NGUI中深度depth和z軸關系的小試驗

而現在有個有趣的想法,就是既然這樣可以達到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的問題。

  • NGUI中深度depth和z軸關系的小試驗
  • NGUI中深度depth和z軸關系的小試驗
  • NGUI中深度depth和z軸關系的小試驗
7

=================================================================================================================================================================================================================

其實上面的東西總結出來就一句話:(啰嗦那麼多,總結卻這麼少,好沒成就感,呵呵)

在相同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條一樣。

NGUI中深度depth和z軸關系的小試驗

此外對于将文字打包到Atlas中,是在制作字型是,在FontMaker中選擇目标Atlas,此時就會将文字打包到了此Atlas中。不過要注意,這個操作會修改Atlas,是以不要弄錯了

如下圖,就是将官方的Arimo14字型打包到了DiShuTest圖集中,也就是在Output選項中選擇Atlas。而or select這項中的字型會被替換掉,可以不選,當然Atlas在不打包字型的時候也可以不選

NGUI中深度depth和z軸關系的小試驗

而對于中文,文字因為不能像英文那樣用單個的字母來組成,是以為了能顯示大多數的常用字,一般都是用單獨的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,但它卻顯示在了最上面。

NGUI中深度depth和z軸關系的小試驗

現在用z軸控制他們的顯示順序和depth一樣,很容易就做到了。

NGUI中深度depth和z軸關系的小試驗

這些試驗都是在比較簡單的情況下做的,是以可能并不真的對,是以如果有錯誤的地方請指出。

繼續閱讀