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模式,还能自由控制渲染顺序:
- 将挂载在3D物体上的Canvas的Render Mode改为
Screen Space - Overlay - 编写简单脚本,通过
Camera.main.WorldToScreenPoint(transform.position)(这里的transform指3D物体的Transform组件)把世界空间坐标转换成屏幕空间坐标 - 将转换后的坐标赋值给Canvas的
RectTransform位置,让它始终跟随3D物体的屏幕位置 - 最后在Canvas的Sorting Layer或Order 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




