如何用UI遮罩屏蔽世界空间GameObject的鼠标事件?
Unity UI遮罩阻止3D物体鼠标事件的解决方案
首先得说清楚为啥你之前的方法没用:带BoxCollider的3D物体触发OnMouseDown()靠的是物理射线检测(Physics.Raycast),而Screen Space – Overlay模式的Canvas属于UI系统,它的Raycast Target只负责挡住UI层面的射线,和物理射线完全是两条独立的检测通道,所以遮不住3D物体的鼠标事件。
给你几个实测有效的解决办法:
方法一:用相机分层屏蔽物理射线
- 给所有需要被屏蔽的3D物体统一设一个Layer,比如叫「可交互物体」
- 找到场景里的主相机,在Inspector面板里修改它的Culling Mask,把「可交互物体」这个层取消勾选
- 这样相机发射的物理射线就扫不到这些物体了,
OnMouseDown()自然不会触发;要恢复交互时,再把这个层勾回来就行
方法二:用3D遮罩物体挡射线
- 创建一个Plane或者Cube,缩放调整到刚好覆盖相机的整个视野,把它放在所有3D物体的前方(Z轴数值比其他物体更靠近相机)
- 给这个遮罩加个BoxCollider,材质用完全透明的(或者干脆不用材质,反正只是挡射线)
- 不需要写任何脚本,因为物理射线会先命中这个遮罩,后面的3D物体就收不到鼠标事件了
- 注意把遮罩的Layer单独设一个,别和其他物体混在一起,避免干扰其他逻辑
方法三:给交互逻辑加全局开关
- 在所有带
OnMouseDown()的脚本里,加一个静态全局变量,比如:public static bool isMaskActive; - 在
OnMouseDown()的第一行加判断:void OnMouseDown() { if (isMaskActive) return; // 原来的交互逻辑 } - 显示遮罩时把
isMaskActive设为true,隐藏时设为false就行
额外提醒
如果非要用UI Canvas来做,也可以把Canvas改成Screen Space – Camera模式,给遮罩Image加个BoxCollider,然后在EventSystem里调整射线检测的优先级,但这个方法不如上面几个直接,容易出兼容问题。
内容的提问来源于stack exchange,提问作者user1566515
相关产品推荐
相关产品推荐

