You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:42:33