2

我有一个函数可以检查一个游戏对象是否可以看到另一个游戏对象而没有任何东西挡住它的视线:

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”标志的碰撞器发生碰撞;我希望光线投射忽略它们。有任何想法吗?

4

3 回答 3

10

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

1 .对于 3D,传递QueryTriggerInteraction.IgnorePhysics.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描述的层。

于 2017-06-07T02:37:12.793 回答
5

要让您的光线投射忽略 5.2 中的所有触发对撞机,请访问:

编辑>项目设置>物理>取消选中“查询命中触发器”

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

实际上,在 5.2.0f3 版本中,它不再显示 Raycasts... 它现在显示为:“Queries Hit Triggers” 如果您希望 raycasts 通过触发器对撞机,请取消选中。

于 2017-06-07T05:30:24.390 回答
0

在Ignore Raycast上更改触发的 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;
    }
}
于 2017-06-07T01:38:32.100 回答