【小松教你手游开发】【unity实用技能】u3d 层次问题总结
首先的首先,NGUI區分前后層次關系是用Depth值。已經跟z軸值無關
首先因為我自己用的是NGUI,所以我的u3d層次問題也就是NGUI的層次問題
先確定UI渲染順序,Camera>UIPanel>Depth(UIWidget)
這里的意思是,首先確定前后關系的是不同大塊之間的Camera的Depth值,根據Depth大小排列,這個決定了每個大塊之前的前后關系。
接著根據UIPanel的Depth前后排序,這個是用于每個大塊內可能有多個UIPanel分割成多個小塊,每個小塊間的前后關系。
最后是UIWidget(比如UILabel,UISprite,這些都繼承于UIWidget)的Depth值,在同一個UIPanel下,決定前后關系。
這里總結來說有兩個方面的問題:
1.整體的層次
2.UIPanel 間的層次
一、整體的層次:
整體的層次指的是一個游戲UI一般會分為幾個模塊,如Effect(特效)、Background、Main、Popup等。在這些大塊之間要區分前后關系時(比如Background最后,Main中間,Popup最前)就要區分到前后層次關系。這些層次一般會有同一個父節點UI_Root(不在同一個父節點也可以)
基本上整體的層次是根據Layer來分前后關系,Layer本身是不帶Depth,所以在這些大塊下,一般在他們的gameobj本身或者在他們下面會有個子節點Camera。通過Camera的CullingMask來確定這個Camera具體渲染哪個Layer下的東西。而通過這個Camera的Depth值來確定整體層次間的前后關系。
注意:在大塊的Camera之間如果Depth值相同時,z軸值會影響前后關系。但是這個應該是要避免的。不應該有相同Depth值得不同Camera
二、UIPanel 間的層次
網上有很多分析在不同Atlas(圖集)不同depth不同z軸值時的前后關系。但是如果知道為什么就能處理所有情況。這里解釋一下。
其實前后層次關系是怎么形成?是因為渲染順序的前后關系,越晚渲染的越在前面,所有通過把一個場景分割成幾塊,排一下渲染順序,按順序渲染就能使界面正常顯示而不導致遮擋錯亂,這樣就能控制好UI的層次關系。
而UIPanel的作用就是用來確定把什么東西放在一起渲染和UIPanel的Depth就是確定每一塊的渲染順序,最后生成一個Drawcall。
所以首先要解決的是把什么東西渲染到一塊,也就是一個Drawcall里面要渲染什么,一個UIPanel里要包括什么。
舉個例子:
像這個界面可以分成幾塊:
每一塊都可以分成一個UIPanel,每個UIPanel控制自己的Depth和透明度。可以處理好之間的遮擋問題。
以上是NGUI的基本渲染邏輯, 但是NGUI會自動把同一界面的同一張圖集的東西一起渲染,也就是不管你這里幾個UIPanel,UIPanel的Depth是3,4,5,還是30,40,50,只要是同一張圖集的就會一起渲染。再通過加成計算算出前后關系。但是這里會有一個問題,就是假如你有兩張圖集,兩張圖集的圖片的Depth相互交叉,這樣會導致NGUI無法識別同一圖集,導致渲染出錯,導致更多的Drawcall。
例:如果在同一個atlas的兩個sprite的depth不同比如1,3.在同一panel中有另一個atlas(比如字體)的depth在他們中間,比如2.就是
atlas1_sprite:depth 1
font_label:depth 2
atlas1_sprite:depth 3
這樣不是兩個drawcalls是三個
這個就是導致為什么在在不同情況下Depth會控制不了渲染順序的原因。
所以這里一般項目就會有一個比較取巧的方法避免。
1.UI只用一張圖集,2.字體的Depth放到300以上。
然后在完成一個UIPanel后需要檢查一下,Drawcall是否正常。這個可以在NGUI的工具里打開Drawcall Tool來查看。(目標是把相同圖集的Drawcall合并成一個)
之后的UIPanel的問題都會通過UIPanel和UIWidget的Depth來解決
轉載于:https://blog.51cto.com/13638120/2084899
總結
以上是生活随笔為你收集整理的【小松教你手游开发】【unity实用技能】u3d 层次问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lisp 画双线带倒圆角_VisualL
- 下一篇: 违章查询API_路帮网