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

如何阻止RayCast穿透UI Button并击中其后方的Collider?

解决Unity中RayCast穿透UI Button触发后方Collider的问题

我来帮你搞定这个问题——你遇到的核心问题是:Unity的UI射线检测系统和物理射线检测系统是完全独立的两套逻辑,所以即使你点击了Button触发了UI事件,物理射线还是会直接穿透UI元素,击中后方的Collider。下面是几种简单有效的解决方案:

方案一:通过EventSystem判断是否点击在UI上

Unity的EventSystem提供了现成的方法,能直接判断当前鼠标/触摸点是否落在UI元素上。如果检测到点击了UI,就跳过物理射线的逻辑即可。

修改你的Update方法:

void Update () { 
    if (Input.GetMouseButton(0)) { 
        // 先判断当前点击是否命中UI元素
        if (EventSystem.current.IsPointerOverGameObject()) {
            return; // 命中UI的话,直接跳过后续物理射线检测
        }

        RaycastHit hit; 
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
        if (Physics.Raycast(ray, out hit, 100, touchControl)) { 
            Destroy(GameObject.FindGameObjectWithTag("Destination")); 
            CalculatedDestination = Instantiate(Destination, hit.point, Quaternion.identity); 
        } 
    }
}

这个方法是最常用也最直观的处理方式,不需要调整任何层级或组件设置。

方案二:让物理射线忽略UI所在层

如果你的Button所在的Canvas是在UI层(Unity默认的UI层),可以修改你的touchControl遮罩,让物理射线直接排除UI层的对象。

修改你的Start方法:

void Start(){ 
    // 获取TouchControl层的遮罩,同时排除UI层
    int uiLayerIndex = LayerMask.NameToLayer("UI");
    touchControl = LayerMask.GetMask("TouchControl") & ~(1 << uiLayerIndex); 
}

这样物理射线就不会检测到UI层的任何对象,自然不会穿透Button击中后方的Collider了。

额外说明

你之前设置的Graphic Raycaster组件参数,只负责控制UI射线是否被3D物体阻挡,和物理射线是否穿透UI没有关系——这两套射线系统是独立运行的,所以必须单独处理物理射线的穿透问题。

内容的提问来源于stack exchange,提问作者Fabio S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:07:17