如何使光线投射忽略触发器对撞机?

时间:2017-06-07 01:19:13

标签: c# unity3d raycasting unity2d

我有一个函数可以检查游戏对象是否可以看到另一个游戏对象,而不会阻挡其视图:

public bool CheckVision(GameObject target)
{
    RaycastHit2D ray = (Physics2D.Raycast(transform.position, target.transform.position - transform.position, m_VisionRange));
    if(ray.collider.name == target.name)
    {
        Debug.DrawRay(transform.position, target.transform.position - transform.position);
        return true;               
    }
    else
    {
        return false;
    }
}

唯一的问题是我不希望它与设置了“isTrigger”标志的碰撞器碰撞;我希望raycast能够忽略它们。有什么想法吗?

3 个答案:

答案 0 :(得分:8)

图层蒙版操作需要。如果仅忽略标记为触发器的碰撞器,则不必使用图层。此操作现在内置于Unity 5.2及更高版本。

1 。对于3D,请将QueryTriggerInteraction.Ignore传递给Physics.Raycast函数。

int layer = 1 << LayerMask.NameToLayer("Default");
Physics.Raycast(cameraRay, out hit, distance, layer, QueryTriggerInteraction.Ignore);

2 。对于2D,如果您不希望它检测到触发器,请将Physics2D.queriesHitTriggers设置为false。如果希望它再次检测触发器,请将其设置为true。确保在调用Physics2D.Raycast函数之前进行设置。

不要检测触发器:

Physics2D.queriesHitTriggers = false;

检测触发器:

Physics2D.queriesHitTriggers = true;

您正在寻找2D版本。

注意

我已经看到有关这种情况的报告没有在Unity的某个版本上工作,这是一个错误,但我认为它现在已经修复。如果没有,则使用l1sten所描述的图层。

答案 1 :(得分:2)

要让你的光线投射忽略5.2中的所有触发器碰撞器,请转到:

编辑&gt;项目设置&gt;物理学&gt;取消选中“查询点击触发器”

(如果您使用的是旧版Unity,则复选框称为“Raycasts Hit Triggers”)

实际上在版本5.2.0f3中它不再说Raycasts ......它现在显示为:“查询命中触发器”如果你想让光线投射通过触发器碰撞器,请取消选中。

答案 2 :(得分:0)

忽略光线投射上更改触发的GameObjects图层或使用LayerMask https://docs.unity3d.com/ScriptReference/LayerMask.html

int targetLayer = 1 << LayerMask.NameToLayer("Target Layer");
public bool CheckVision(GameObject target)
{
    RaycastHit2D ray = (Physics2D.Raycast(transform.position, target.transform.position - transform.position, m_VisionRange, targetLayer ));
    if(ray.collider.name == target.name)
    {
        Debug.DrawRay(transform.position, target.transform.position - transform.position);
        return true;               
    }
    else
    {
        return false;
    }
}