在Unity中,Screen Space - OverlayScreen Space - Camera 是UI画布(Canvas)的渲染模式,二者存在以下区别:

渲染原理

  • Screen Space - Overlay:这种模式下,UI会直接渲染在屏幕最上层,与场景中的摄像机设置无关。无论场景摄像机的位置、角度和视野如何,UI都会覆盖在整个屏幕上,并且不会被场景中的物体遮挡。
  • Screen Space - Camera:此模式下,UI会根据指定的摄像机进行渲染,被渲染到该摄像机的视锥体中。UI的位置和大小会受摄像机的位置、旋转和视野影响,并且可能会被场景中的物体遮挡。

位置和缩放

  • Screen Space - Overlay:UI元素的位置是基于屏幕坐标系,原点位于屏幕左下角。UI元素的大小和位置在不同分辨率的屏幕上会自适应,不过可能会出现拉伸或变形的情况。
  • Screen Space - Camera:UI元素的位置和大小由摄像机的属性以及画布的距离决定。你可以通过调整摄像机的参数和画布与摄像机的距离,来控制UI的显示效果。在不同分辨率的屏幕上,需要进行额外的设置以保证UI的显示效果一致。

深度和遮挡

  • Screen Space - Overlay:由于UI总是渲染在屏幕最上层,所以不会被场景中的物体遮挡。
  • Screen Space - Camera:UI元素会参与场景的深度测试,因此可能会被场景中的物体遮挡,也可以遮挡场景中的物体。

性能

  • Screen Space - Overlay:因为不依赖摄像机,渲染过程相对简单,性能开销通常较低。
  • Screen Space - Camera:由于需要和场景中的物体进行深度测试和渲染排序,性能开销相对较高。

以下是简单的代码示例,展示如何在脚本中设置画布的渲染模式:

using UnityEngine;
using UnityEngine.UI;

public class CanvasModeExample : MonoBehaviour
{
    public Canvas canvas;

    void Start()
    {
        // 设置为 Screen Space - Overlay 模式
        canvas.renderMode = RenderMode.ScreenSpaceOverlay;

        // 设置为 Screen Space - Camera 模式
        // canvas.renderMode = RenderMode.ScreenSpaceCamera;
        // canvas.worldCamera = Camera.main;
    }
}

在这个示例里,你可以通过修改 renderMode 属性来改变画布的渲染模式。如果选择 Screen Space - Camera 模式,还需要指定一个摄像机。