You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity技术问题:如何让World Space Canvas显示在Screen Space Overlay Canvas上方?

解决World Space Canvas显示在Screen Space Overlay下方的问题

针对你描述的场景——主UI在Screen Space Overlay Canvas,另一个Canvas挂载在3D物体上(原World Space模式)但被主UI遮挡的问题,这里有两种实用的解决方案:

方案一:新增专用相机(来自derHugo的思路)

  • 创建一个新的正交相机,调整参数让它只聚焦在你的World Space Canvas上
  • 给这个相机设置专属的渲染层级(Layer),确保它只渲染World Space Canvas所在的层
  • 在相机的Camera组件中,将Depth值设得比主正交相机更高,这样它的渲染结果会覆盖在主UI之上
  • 记得关闭这个相机Clear Flags里的颜色和深度缓冲,避免干扰主相机的画面显示

方案二:转换Canvas模式(更轻量化的实操方案)

这个方法无需新增相机,通过坐标转换将原World Space UI转为Screen Space Overlay模式,还能自由控制渲染顺序:

  1. 将挂载在3D物体上的Canvas的Render Mode改为Screen Space - Overlay
  2. 编写简单脚本,通过Camera.main.WorldToScreenPoint(transform.position)(这里的transform指3D物体的Transform组件)把世界空间坐标转换成屏幕空间坐标
  3. 将转换后的坐标赋值给Canvas的RectTransform位置,让它始终跟随3D物体的屏幕位置
  4. 最后在Canvas的Sorting LayerOrder in Layer中调整数值,设置比主UI更高的层级,就能确保它显示在主UI之上

附一段简单的示例脚本:

using UnityEngine;

public class Follow3DObjectUI : MonoBehaviour
{
    public Transform target3DObject;
    private RectTransform _canvasRect;

    void Start()
    {
        _canvasRect = GetComponent<RectTransform>();
    }

    void Update()
    {
        if(target3DObject != null)
        {
            Vector2 screenPosition = Camera.main.WorldToScreenPoint(target3DObject.position);
            _canvasRect.position = screenPosition;
        }
    }
}

把这个脚本挂在转换后的Screen Space Overlay Canvas上,指定目标3D物体,就能让UI跟随物体移动,同时轻松控制渲染层级。

内容的提问来源于stack exchange,提问作者Jibs

火山引擎 最新活动