2017-03-06 67 views
1

我有一个脚本,我使用多个raycasts从一个对象来检查是否有一个特定的图层蒙版被命中,我在他们之间使用for循环,它工作正常。如何知道是否有某物被射线击中?

但问题是:如果光线的一个被击中booleantrue,如果“所有”的光线没有命中,booleanfalse。但问题是我不知道如何检查。

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

+0

'Physics2D.Raycast'将始终返回一个非空的'RaycastHit2D'对象所以'如果(命中)'永远是真的。这是您应该检查的返回对象的'collider'属性。 – Foggzie

回答

2

根据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. 
    } 
} 
+0

我不能相信我所需要的只是休息; :D感谢Man其工作很棒(hit)不需要(hit.collider)也许physics2D的工作方式不同 –

0

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,也更新它每次调用函数时所以你检查布尔值是否为true,如果没有命中,你不需要检查它的自动返回false如果你更新函数

相关问题