Unity2D游戏对象的渲染顺序

渲染顺序

在Unity2D中,与渲染顺序相关的主要设置及其优先级排序如下:

  1. Sorting Layer

    Sorting Layer的层级决定了大的渲染顺序。层级值越高,渲染越靠后。

  2. Order in Layer

    在同一Sorting Layer下,Order in Layer值越高,渲染越靠后。

  3. Z Position

    2D对象的Z坐标值,值越小渲染越早。

  4. Renderer Components

    Sprite Renderer先于Tilemap Renderer渲染。

  5. Camera Settings

    Clear Flags会影响背景渲染顺序。

    Camera Depth参数会影响对象遮挡关系。

  6. Sorting Groups

    同一个Sorting Group中的对象会作为一个整体渲染。

  7. Transform Position

    2D对象在场景中的位置会对渲染顺序有细微影响。

所以在Unity2D中,Sorting Layer和Order in Layer的组合优先级最高,其次是Z Position和Camera Settings,然后是Renderer Components和Sorting Groups,最后是Transform Position的细微影响。开发者可以根据这个优先级顺序合理安排渲染顺序。

Unity2D开发的时候我们可以设置排序的层级

image-20230812131012692

在渲染的对象上都有设置层级的属性

我们发现除了Sorting Layer,还有Order in Layer

image-20230812131223361

文字的配置在

image-20230812133423005

这两者都有一个渲染的数值,数值越小的越先渲染

在同一z轴上的,渲染越靠后,视觉显示的就是在上层。

也就是说值越大,越在上层。

而Z Position直接是渲染在不同的层上。

Z Position的值越小就越在上层。

这给人的感觉这两者正好的是反的。

这就得从坐标系和相机讲起了。

坐标系

左手坐标系

Unity的坐标系是左手坐标系

image-20230812132206247

这样Z轴的正值是朝里的,所以相机在正前方,所以Z值一定是负值。

相机的Z为啥是-10

在Unity中,相机的z坐标值为-10是一个默认值和约定俗成的设置。
主要原因有以下几点:

  1. 相机默认是从屏幕正面向场景深处拍摄,所以z坐标理应为负值。
  2. z值为-10可以让大多数模型位于相机的正前方拍摄范围内, 不至于太近也不太远。
  3. 以玩家为中心的游戏场景,玩家高度通常在1-2米左右,设定z=-10可以让相机框住玩家视野。
  4. 与正射投影相机z=0形成区分,因为正交相机不需要考虑深度。
  5. 数值不取极大或极小,便于后期调整参数而不用改动太多其他依赖相机z坐标的运算。
  6. 部分Unity内置函数与组件依赖此默认值进行计算。
  7. 太高或太低的z值可能更容易产生z fighting问题。
  8. 作为默认值便于开发者快速上手,不需要刻意设置。

所以综合起来,z=-10是一个对大多数游戏场景都适用的经验值,成为Unity中相机的默认z坐标。

开发者可以根据实际需要调整此值。

Z轴不同的物体能碰撞吗?

在Unity2D中,z轴表示物体的层次关系和绘制顺序,而不代表真实的3D空间中的z轴高度。
Unity2D中的碰撞检测是基于物体的2D碰撞体(Collider2D组件)进行的。

只要两个碰撞体在2D平面上产生重叠,就会发生碰撞,与z轴顺序无关。
例如:

  • 物体A带BoxCollider2D组件,z轴顺序为1
  • 物体B带CircleCollider2D组件,z轴顺序为2

即使A在视觉上绘制在B的下层,但只要它们的碰撞体在2D投影中发生重叠,仍然会触发OnCollisionEnter2D等碰撞回调函数。
所以在Unity2D环境中,物体的z轴顺序不会影响它们之间的碰撞检测和处理。

只要碰撞体在2D空间发生重叠,就会碰撞,与z轴无关。

另外需要注意的是,如果两个物体的碰撞体在2D上没有重叠,即使调整它们的z轴顺序也不会产生碰撞。

碰撞检测依然仅基于2D碰撞体的形状进行。

开发建议

Sorting LayerOrder in LayerZ Position都决定了Unity2D渲染元素的前后。

这里建议不要都修改,这样会让游戏很混乱。

建议

只使用Sorting Layer来决定前后,后期不合适的时候直接拖动设置的前后就能方便的变更了。

当然在自己简单测试的时候可以让Sorting Layer都保持默认,只修改Order in Layer就可以方便测试了。