Unity 中SoringLayer 和 Layer 的区别、相机、渲染顺序和射线检测

SoringLayer 和 Layer 的区别

SoringLayer :排序层级。影响物体渲染的顺序,具体的规则见后文。

Layer:层级。用于物体的逻辑分层。

  • 在物理相关的射线检测等时,可以指定忽略/只关注某些层级的物体。
  • 相机可以设置只渲染特定层级的物体。

相机

Unity 中的相机会影响渲染顺序和射线检测。

默认情况下相机的 rotation 为(0, 0, 0),朝向 z 轴正方向。
在 2D 游戏中,如果相机的 rotation 设置为(180, 0, 0),则画面上下颠倒;
如果设置为 (0, 180, 0),则画面上下颠倒。

本文以默认情况,即相机 rotation(0, 0, 0)、position(0, 0, -10)、scale(1, 1, 1)为例。

渲染顺序

基本规则

按照如下规则依次来确定渲染排序
(先渲染的会被后渲染的覆盖。仅当前一个条件相同时,才会比较下一个条件。)

  • 物体的 SortingLayer。根据 Project Setting - Tags & Layers 中的顺序,越靠上的 SortingLayer 越先渲染。
  • 物体的 OrderInLayer。数字越小越先渲染。
  • 物体距离摄像机的距离。越远的越先渲染。在 2D 游戏中(默认设置下摄像机朝向 z 轴正方向时),这通常等价于 z 坐标,越大的越先渲染。

物体距离摄像机的距离,这条规则还有更多的细节,后文会再补充。

验证规则

  • 创建 2D 项目

  • 添加 SortingLayer: Top。

  • 创建一个空场景 TestSortingLayer。
  • 创建一个节点,重命名为 Red,挂载 SpriteRenderer 组件,在 Sprite 属性点击右侧小圈后选择 Unity 的自带资源 Background,修改颜色为红色。

  • 复制 Red 结点,重命名新节点为 Green,修改颜色为绿色,将 Green 的结点往右下角移动,使得两个结点不完全重叠。大致关系如下即可。

  • 可以看到 Red、Green 结点的 SoringLayer(Default)、OrderInLayer(0)、z 坐标(0) 都是相等的。

  • 通过每次只改变其中一项来观察图片的覆盖情况,可以得出三个规则各自的渲染顺序如上文所述。
    (每种情况测试后,都需要把修改还原,再进行下一个情况的测试。)

    • case1

    只修改 Red 结点的 SortingLayer 为 Top,可以发现 Red 结点在上。

    • case2

    只修改 Red 结点的 OrderInLayer 为 1,可以发现 Red 结点在上。

    • case3

    只修改 Red 结点的 z 坐标为 -1,可以发现 Red 结点在上。(相机 z 坐标在 -10,物体的 z 坐标越小,离相机越近。但是不能小于 -10,否则就不能被相机捕获并渲染。)

  • 同时,可以发现三个规则的生效是有上文所述的优先级的。

    • case4

    修改 Red 结点的 SoringLayer 为 Top 后,只要 Green 结点的 SoringLayer 仍为 Default,无论如何修改 Green 结点的 OrderInLayer 和 z 坐标 ,都可以发现 Red 结点在上。

    • case5

    Red 和 Gredd 结点的 SoringLayer 都为 Top,修改 Red 的 OrderInLayer 为 1,Green 的 OrderInLayer 为 0,无论如何修改 Green 结点的 z 坐标,都可以发现 Red 结点在上。

距离的更多细节

物体距离相机的距离这条规则,还有细节可以继续深入。

查看官网文档 https://docs.unity3d.com/Manual/Sprites.html 中 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

验证
  • 将 Red、Greed 结点的 scale 改成 (200, 200, 1),移动结点位置,使得 Red 结点的中心位置在左上角,Greed 结点的中心在中央。

  • Green 结点的 z 坐标修改 为 5,Red 结点的 z 坐标为 0 保持不变。此时 Red 结点在上。因为此时决定物体渲染顺序的距离是:在相机方向上(也就是 z 轴正方向上)物体和相机的距离,也就是 z 坐标的差值。Red 结点所在平面 距离 相机所在平面 更近。
  • 修改相机的 Projection 为 Perspective 或者 修改 Project Settings - Graphics - Camera Settings - Transparency Sort Mode 为 Perspective,可以看到 Green 结点在上。因为此时决定物体渲染顺序的距离是:物体中心和相机中心的距离,也就是两个坐标间的距离。Red、Greed 结点上 z 的差值远小于 x、y 的差值,所以 Green 结点距离相机更近。

更多的细节

除了以上因素,Render Queue、Sorting Group、Material/Shader 也会影响渲染顺序。
更多的细节可以参照 Unity 官方文档 https://docs.unity3d.com/Manual/2DSorting.html。

射线检测

验证

  • 编写 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 组件。

  • 运行游戏。
  • 设置 Red 结点 SoringGroup:Default,OrderInLayer:1,z 坐标:0。
  • 设置 Green 结点 SoringGroup:Default,OrderInLayer:0,z 坐标:0。
  • 可以看到此时无论如何修正 Green 结点的 z 坐标,Red 结点都在上。
  • 点击两个结点重叠的部分,可以看到 onMouseUp:NAME 的输出。
  • 当 Green 结点的 z 坐标大于 Red 结点 z 坐标时,NAME 为 Red。
  • 当 Green 结点的 z 坐标小于 Red 结点 z 坐标且大于 相机 z 坐标时,NAME 为 Green。
  • 当 Green 结点的 z 坐标大于相机 z 坐标时,NAME 为 Red。此时 Green 结点不可见。

结论

Unity 2D 中,点击屏幕时,OnMouseDown、OnMouseDrag、OnUp 是通过射线检测来触发的。也就是物体上必须有碰撞体才能检测到。

当同一位置有多个碰撞体时,距离相机最近的物体,会被首先检测到,并触发相应的方法。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity ,可以使用多相机来实现一个相机渲染前下左右四个面的效果。 1. 创建多个相机 首先,在场景创建多个相机,分别命名为“FrontCamera”、“BackCamera”、“LeftCamera”、“RightCamera”、“TopCamera”、“BottomCamera”,并将它们的位置和旋转分别设置好,使得每个相机渲染场景的一个面。 2. 设置相机参数 接下来,需要对每个相机进行设置。打开每个相机的 Inspector 面板,将 Clear Flags 设置为 Solid Color,将 Culling Mask 设置为只渲染需要的物体层级,将 Projection 设置为 Orthographic。如果需要根据相机的位置和角度动态设置相机参数,可以使用脚本来实现。 3. 渲染到纹理 最后,需要将每个相机渲染结果渲染到纹理。在 Unity ,可以使用 RenderTexture 来实现。创建 6 个 RenderTexture,分别命名为“FrontTexture”、“BackTexture”、“LeftTexture”、“RightTexture”、“TopTexture”、“BottomTexture”,并将它们的分辨率设置为相应的面的大小。 在每个相机的 Inspector 面板,将 Target Texture 设置为对应的 RenderTexture。然后,在需要使用渲染结果的物体上添加一个 Material,并将 shader 设置为 Unlit/Texture。将每个 RenderTexture 分别赋值给 Material 的贴图属性,即可将渲染结果显示在物体上。 需要注意的是,如果相机渲染结果不在同一个位置,需要对渲染结果进行位置和旋转的调整,以保证显示正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值