2017-03-06 68 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如果你更新函數

相關問題