Unity 三種遮擋關係
最近連續遇到了幾個繪製圖像之間相互遮擋關係不正確的問題,網上查詢的資訊比較凌亂,所以這裡就把自己解決問題中總結的經驗記錄下來。
Unity中的渲染順序自上而下大致分為三層。 最高層為Camera層,可以在Camera的depth那裡設定,設定之後,圖形的渲染順序就是先繪製depth低的相機下的物體,再繪製depth高的相機下的物體,也就是說,depth高的相機會覆蓋depth低的相機(具體的覆蓋關係有don't clear, solid color等等幾種)
比Camera層稍低一層的是sorting layer層, 隨便找一個可以設定sorting layer的地方,選擇sorting layer,點新增按鈕,就可以看到當前所有的sorting layer,並且可以更改sorting layer的順序,排位靠後的sorting layer會覆蓋排位靠前的sorting layer。 設定好sorting layer的相互關係之後,就可以給任何一個繼承於Renderer類,或者有renderer的子類作為field的物件設定sorting layer了。 注意這些sorting layer的遮擋關係是在同一個camera的層級下的。 不同camera下的renderer渲染順序以camera的depth為準。 有的component的sorting layer可以直接在unity editor裡面設定,比如Sprite Renderer。 有的則需要用程式碼來設定,比如設定Particle system的sorting layer, 就需要在程式碼中取到 ParticleSystem.Renderer.SortingLayer 來進行設定。
比sorting layer再低一層的是sorting order, 這個數字指代的是在同一個sorting layer下的渲染順序,用法很明顯就不贅述了。
需要注意不要混淆的是gameobject的layer,和renderer的sorting layer。 gameObject的layer個人理解是一個邏輯上的分層,用於camera的culling mask等。 而renderer的sorting layer則用於渲染。只有繼承與renderer或者有renderer作為filed的component才需要設定sorting layer。
另外需要指出的是,常用的NGUI的widget depth其本質也是一個sorting layer下的sorting order。 NGUI好像用的是一個叫做“UI"的sorting layer。 由此大家如果有需要,也可以自己取Hack NGUI的程式碼,把NGUI的sorting layer暴露出來供自己定製。
簡單總結一下,決定Unity渲染關係的層級順序是:
Camera
sorting layer
sorting order