Unity的Raycast忽略了LayerMask

3
出于某些原因,我的射线投射击中了在另一个图层上的物体。
private int obstaclesLayerMask = (1 << 11) | (1 << 12);
private Vector3 GetPointOfContactNormal()
{
    Ray ray = new Ray(transform.position, transform.forward);
    if (Physics.Raycast(ray.origin, ray.direction, out hit, obstaclesLayerMask))
    {
        Debug.Log(hit.collider.gameObject.name);
        return hit.normal;
    }

    return Vector3.zero;
}

我尝试将layerMask更改为随机层,甚至是未指定的层,比如 1 << 30,并尝试使用 LayerMask.GetMask(),但raycast仍然会命中物体。只有将layerMask设置为默认层,如 1 << 0,才能使raycast忽略碰撞。

1个回答

5
此外,补充上述答案,我发现了另一点,根据我的知识,它不起作用。看起来你正在将obstaclesLayerMask放在Physics.Raycast的距离参数中。
这些是所有参数:
  1. origin:射线的起点,世界坐标。

  2. direction:射线的方向。

  3. maxDistance:射线应检查碰撞的最大距离。

  4. layerMask:用于选择性忽略碰撞体的层蒙版。

  5. queryTriggerInteraction:指定此查询是否应击中触发器。

如果你更改成下面的这种方式,参数范围就会正确:
//I put it on 300f here but just put there what you prefer.
if (Physics.Raycast(ray.origin, ray.direction, out hit, 300f, obstaclesLayerMask))

1
谢谢,问题解决了。我有点糊涂,因为在Linecast中,你不必在掩码之前放置距离参数,但是在这里你需要这样做。 - Denis Smirnov
不错,这是我在这里的第一个回答问题哈哈,它也在Unity API中:链接 - MaartenVlutters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接