SoringLayer :排序層級。影響物體渲染的順序,具體的規則見後文。html
Layer:層級。用於物體的邏輯分層。ide
Unity 中的相機會影響渲染順序和射線檢測。測試
默認狀況下相機的 rotation 爲(0, 0, 0),朝向 z 軸正方向。 在 2D 遊戲中,若是相機的 rotation 設置爲(180, 0, 0),則畫面上下顛倒; 若是設置爲 (0, 180, 0),則畫面上下顛倒。spa
本文以默認狀況,即相機 rotation(0, 0, 0)、position(0, 0, -10)、scale(1, 1, 1)爲例。3d
按照以下規則依次來肯定渲染排序 (先渲染的會被後渲染的覆蓋。僅當前一個條件相同時,纔會比較下一個條件。)code
Project Setting
- Tags & Layers
中的順序,越靠上的 SortingLayer 越先渲染。物體距離攝像機的距離,這條規則還有更多的細節,後文會再補充。orm
建立 2D 項目cdn
添加 SortingLayer: Top。htm
能夠看到 Red、Green 結點的 SoringLayer(Default
)、OrderInLayer(0
)、z 座標(0
) 都是相等的。blog
經過每次只改變其中一項來觀察圖片的覆蓋狀況,能夠得出三個規則各自的渲染順序如上文所述。 (每種狀況測試後,都須要把修改還原,再進行下一個狀況的測試。)
只修改 Red 結點的 SortingLayer 爲 Top,能夠發現 Red 結點在上。
只修改 Red 結點的 OrderInLayer 爲 1,能夠發現 Red 結點在上。
只修改 Red 結點的 z 座標爲 -1,能夠發現 Red 結點在上。(相機 z 座標在 -10,物體的 z 座標越小,離相機越近。可是不能小於 -10,不然就不能被相機捕獲並渲染。)
同時,能夠發現三個規則的生效是有上文所述的優先級的。
修改 Red 結點的 SoringLayer 爲 Top 後,只要 Green 結點的 SoringLayer 仍爲 Default,不管如何修改 Green 結點的 OrderInLayer 和 z 座標 ,均可以發現 Red 結點在上。
Red 和 Gredd 結點的 SoringLayer 都爲 Top,修改 Red 的 OrderInLayer 爲 1,Green 的 OrderInLayer 爲 0,不管如何修改 Green 結點的 z 座標,均可以發現 Red 結點在上。
物體距離相機的距離這條規則,還有細節能夠繼續深刻。
查看官網文檔 docs.unity3d.com/Manual/Spri… 中 Sorting Sprites 這個章節,能夠發現距離的定義與項目和相機的設置有關。
Unity Editor
- Edit
- Project Settings
- Graphics
- Camera Settings
- Transparency Sort Mode
裏面的設置
默認:根據 camera 的投射模式是透視仍是正交。
Default - Sorts based on whether the Camera’s Projection mode is set to
Perspective or Orthographic
透視、遠景:根據 sprite 的中心和 camera 的直線距離 Perspective - Sorts based on perspective view. Perspective view sorts Sprites based on the distance from the Camera’s position to the Sprite’s center.
正交:根據 camera 方向上, sprite 和 camera 的距離。
Orthographic - Sorts based on orthographic view. Orthographic view sorts Sprites based on the distance along the view direction.
自定義軸:根據設置的軸來排序。
Custom Axis - Sorts based on the given axis set in Transparency Sort Axis
Project Settings
- Graphics
- Camera Settings
- Transparency Sort Mode
爲 Perspective,能夠看到 Green 結點在上。由於此時決定物體渲染順序的距離是:物體中心和相機中心的距離,也就是兩個座標間的距離。Red、Greed 結點上 z 的差值遠小於 x、y 的差值,因此 Green 結點距離相機更近。除了以上因素,Render Queue、Sorting Group、Material/Shader 也會影響渲染順序。 更多的細節能夠參照 Unity 官方文檔 docs.unity3d.com/Manual/2DSo…
編寫 ClickPanel
腳本
public class ClickPanel : MonoBehaviour
{
public readonly UnityEvent onClick = new UnityEvent();
public readonly UnityEvent onMouseDown = new UnityEvent();
public readonly UnityEvent onMouseUp = new UnityEvent();
private void OnMouseDown()
{
onMouseDown.Invoke();
}
private void OnMouseDrag()
{
// 能夠增長判斷,若是拖動超過必定距離或者必定時間,
}
private void OnMouseUp()
{
onMouseUp.Invoke();
onClick.Invoke();
Debug.LogFormat("onMouseUp:{0}", name);
}
}
複製代碼
給 Red、Green 結點都掛載 ClickPanel 腳本 和 BoxCollider2D 組件。
onMouseUp:NAME
的輸出。Unity 2D 中,點擊屏幕時,OnMouseDown、OnMouseDrag、OnUp 是經過射線檢測來觸發的。也就是物體上必須有碰撞體才能檢測到。
當同一位置有多個碰撞體時,距離相機最近的物體,會被首先檢測到,並觸發相應的方法。