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

Unity中使用Raycast忽略碰撞体:穿透A碰撞体点击B物体

让Raycast穿透A碰撞体以点击B的解决方案

以下是几种实用的实现方式,根据你的场景选择即可:

方法1:通过层级掩码排除A的碰撞体

这是最常用的方案,直接让Raycast忽略A所在的层级:

  1. 在Unity编辑器中给A设置一个专属层级(比如命名为IgnoreRaycast_A)
  2. 发射Raycast时,使用层级掩码排除该层级,示例代码:
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        // 生成排除A层级的掩码
        int excludeLayer = LayerMask.NameToLayer("IgnoreRaycast_A");
        int layerMask = ~(1 << excludeLayer);
        
        if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, layerMask))
        {
            if (hit.collider.gameObject == B)
            {
                // 这里写点击B后的逻辑
                Debug.Log("点击了B");
            }
        }
    }
}

方法2:获取所有射线命中结果并筛选B

如果需要保留A的Raycast检测,但仍要穿透到B,可以用RaycastAll获取所有命中对象,再遍历找到B:

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit[] allHits = Physics.RaycastAll(ray, Mathf.Infinity);
        
        foreach (RaycastHit hit in allHits)
        {
            if (hit.collider.gameObject == B)
            {
                // 处理点击B的逻辑
                Debug.Log("点击了B");
                break; // 找到目标后停止遍历
            }
        }
    }
}

注意:RaycastAll的命中结果是按从近到远排序的,所以A会出现在结果数组的前面。

方法3:UI场景下的特殊处理

如果A和B是UGUI元素(比如Image、Button),直接取消A组件的Raycast Target勾选(在Inspector面板的UI组件中),射线会自动穿透A,检测到下方的B。


内容的提问来源于stack exchange,提问作者Savad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:09:19