Unity 世界空间(World Space)UI被模型遮挡的解决办法(Overlay摄像机)

问题: 想要显示掉落的物品名,但是这个世界空间的UI层会被模型遮挡,如下:

解决:

第一种(最简单):

将字体TextMeshPro的Shader改成TextMeshPro/DistanceFieldOverlay即可

(注意:DistanceFieldOverlay字体材质是不会受光照影响,始终在前)


第二种:

1.新建一个专门的物品名图层,如ItemUI

2.在主摄像机下新建一个子摄像机ItemCamera,渲染类型设置为Overlay,剔除遮罩设置为:只显示ItemUI层(清除深度必须勾选,渲染阴影可以取消)

 

3.同时,主摄像机的剔除遮罩中要设置为:不显示ItemUI层,并在主摄像机的堆叠中添加这个子摄像机

效果如下:

PS:此方法可能会存在:多摄像机情况下,OnMouseEnter无法触发的问题。若遇到这个问题,可以尝试把主摄像机的 渲染——优先级从 -1 改为 1 或 更大

### Unity Canvas 源码分析 #### Canvas 类的核心功能 `Canvas` 是 Unity UI 系统中的核心组件之一,负责管理所有的 UI 元素。每个 `Canvas` 组件都关联着一个渲染器,用于决定如何以及在哪里绘制其子对象[^1]。 ```csharp public class Canvas : Behaviour, ICanvasRaycastFilter { public enum RenderMode { ScreenSpaceOverlay, ScreenSpaceCamera, WorldSpace } private Camera m_Camera; private RectTransform m_RectTransform; // ...其他成员变量和方法... } ``` #### 渲染模式解析 `Canvas` 支持三种不同的渲染模式: - **Screen Space - Overlay**: 所有UI元素直接覆盖在屏幕上,不受到任何摄像机的影响。 - **Screen Space - Camera**: UI元素相对于指定的摄像机位置显示,在屏幕空间内渲染但可以跟随摄像机移动。 - **World Space**: 将UI放置于世界坐标系中,如同普通的三维物体一样处理[^2]。 每种模式决定了最终图像的位置计算方式及其与场景其它部分的关系。 #### 更新过程 当游戏运行时,`Canvas` 的更新流程主要包括两个阶段:布局(Layout) 和 图形(Graphic)[^3]。 1. 布局阶段会遍历所有子节点并调整它们的位置大小; 2. 图形阶段则准备实际要绘制的内容,并提交给渲染管线。 此过程中涉及到多个内部类如 `Graphic`, `LayoutRebuilder` 来协助完成具体工作。 #### 性能优化建议 为了提高性能表现,开发者应当注意以下几点: - 合理设置 `Render Mode` 及相关参数以适应不同需求; - 使用合适的遮挡剔除策略来减少过量绘图调用[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值