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 是经过射线检测来触发的。也就是物体上必须有碰撞体才能检测到。
当同一位置有多个碰撞体时,距离相机最近的物体,会被首先检测到,并触发相应的方法。