如何知道射线是否击中了某物或什么都没有?

How to know if something or nothing was hit by a ray?

我有一个脚本,我使用来自一个对象的多个光线投射来检查是否有特定的图层蒙版被击中,我在它们之间使用 for 循环并且它工作正常。

但问题是:如果其中一条射线被击中,boolean 将是 true,如果 "all" 射线未被击中,则 boolean 将是 false。但问题是我不知道如何检查。

for (int i = 0; i < rays; i++) 
{
    Vector2 raysStart = raysStart.topLeft + Vector2.right * (raysSpacing * i);
    RaycastHit2D hit = Physics2D.Raycast (raysStart, Vector2.up, 10, checkMask);

    if (hit)
    {                     
        Debug.DrawLine (raysStart, raysStart + Vector2.up * 10, Color.red);
        boolean= true;
    } 
    else if (!hit)
    {                     
        Debug.DrawLine (raysStart, raysStart + Vector2.up * 10, Color.green);
        boolean= false;
    }
}

我也尝试过使用 else 而不使用 else if (!hit),效果一样。

所以有 4 条射线,如果其中一条射线击中了其他三条射线却没有击中,所以它总是给我没有击中接受。

如果我在播种时以任何方式击中循环中的最后一条光线,如果你能告诉我如何制作,如果 4 条光线中的一条光线被击中,则 boolean 变为 true 并且如果所有未击中它的 4 条射线变为 false.

根据 documentation,如果没有命中,hit.collider 将是 null

bool anyHit = false;
for (int i = 0; i < rays; i++) 
{
    Vector2 raysStart = raysStart.topLeft + Vector2.right * (raysSpacing * i);
    RaycastHit2D hit = Physics2D.Raycast (raysStart, Vector2.up, 10, checkMask);
    if (hit.collider != null)
    {
        anyHit = true;
        break; // Don't need to check the rest after we found one hit.
    }
}

Crusha K. Rool 回答了正确答案,我找到了另一个答案

boolean= false;

    for (int i = 0; i < rays; i++) 

    {

        Vector2 raysStart = raysStart.topLeft + Vector2.right * (raysSpacing * i);
        RaycastHit2D hit = Physics2D.Raycast (raysStart, Vector2.up, 10, checkMask);

        if (hit)
        {                     
            Debug.DrawLine (raysStart, raysStart + Vector2.up * 10, Color.red);
            boolean= true;
        } 
        else if (!hit)
        {                     
            Debug.DrawLine (raysStart, raysStart + Vector2.up * 10, Color.green);

        }
    }

这里的想法是布尔值默认为 false 并且每次调用该函数时它都会更新,因此您检查是否命中布尔值将为真,如果没有命中则不需要检查其自动 [=如果更新函数

,则 15=] 为 false