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

问题描述 投票:1回答:3

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

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能够忽略它们。有任何想法吗?

c# unity3d raycasting unity2d
3个回答
2
投票

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

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

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

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


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描述的图层。


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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.