項目中已經全面採用3D與2D結合的方式來製作UI,3D界面的透視感會更強。但是有一部分UI還必須是不帶透視的,所以需要採取正交與非正交攝像機結合的方式。3D界面有兩種方式,第一種是需要進行屏幕自適應的,另一種不需要與屏幕自適應,我姑且把第一種稱假3D界面,第二種稱真3D界面。
假3D界面的效果是,Image具有透視關係,旋轉後有近大遠小的效果,而且還能與屏幕進行自適應,做法很容易直接將Camera改成頭攝像機就可以。
此時對Image進行旋轉就會有透視關係,而且還能與屏幕自適應。
現在問題來了,如果場景有3D模型,比如給模型頭頂要畫一張圖,圖片和模型一樣也需要有透視關係,這時候用假3D界面的就不行了,因為圖片自適應以後就無法和模型的位置對上的,此時我們要引入一個新的方法純3D界面。
為了讓Image和3D物體坐標單位統一,首先把Canvas的Scale縮小100倍(UI被放大了100倍),然後將RenderMode改成WorldSpace
這時候Image和Text不需要調整width和hight,縮放單位和Cube的3d世界單位完全一致
無論真3D界面還是假3D界面,現在又面臨一個問題,如果在同一攝像機同時看3D物體和UI就會產生渲染排序的問題,這會影響到Alpha Blend的結果。
半透明物體是不畫深度的,對於UI來說全都是半透明,如果想做一種效果,背景圖是UI,前面放個3D角色特效、最前面在放UI,這種疊層的方式就會出問題。因為UI是優先SortingOrder然後才是RenderQueue(在URP下是Priority)無論怎麼改RenderQueue也得不到正確的結果
UI因為要處理層級就會修改Canvas的SortingOrder,這樣界面的SortingOrder的值就比3D模型大,這就會先畫3D模型,然後在畫UI,最終顯示結果就會出錯。所以要給MeshRender修改它的SortingOrder,這樣UI、粒子、模型全都統一了SortingOrder作為單位,就好調層級了。
public class SortOrder : MonoBehaviour{ public int MyOrder; private void Start() { GetComponent<Renderer>().sortingOrder = MyOrder; }}
最後就是攝像機的組合了,調整好順序就萬事大吉了。
聲明:發布此文是出於傳遞更多知識以供交流學習之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與我們聯繫,我們將及時更正、刪除,謝謝。
作者:雨松MOMO
原文:https://www.xuanyusong.com/archives/4783
More:【微信公眾號】 u3dnotes