2017-03-06 10 views
1

特定のレイヤーマスクがヒットしているかどうかをチェックするために、あるオブジェクトから複数のレイキャストを使用するスクリプトがあり、その間に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 if (!hit)なしelseにしようと、それは同じように働きました。

光線のうちの1つが3つ打つと4つの光線があるので、それは常に私にヒット受け入れないようにヒットしません。

あなたは4線から1本の光線がヒットした場合booleantrueになり、すべての4線がヒットしない場合、それはなりようにする方法を私に伝えることができた場合、私はシードとして私は、ループ内でどのような方法を、最後の線をヒットした場合false

+0

'Physics2D.Raycast'は常に非ヌル' RaycastHit2D'オブジェクトを返しますしたがって、 'if(ヒット)'が常にtrueになります。それはあなたが照合しなければならない返されたオブジェクトの '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おかげで仕事が盛り沢山でした(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であることであり、また、それはあなたが関数を呼び出すたびに更新を発見した別の答えがありますあなたがブール値が真であるかどうかをチェックし、ヒットしなかった場合は、関数を更新すれば自動復帰をチェックする必要はありません。

関連する問題