2017-03-06 1 views
1

특정 레이어 마스크가 맞았는지 확인하기 위해 하나의 객체에서 여러 개의 raycast를 사용하는 스크립트가 있고 그 사이에 for 루프를 사용하고 있습니다.레이가 무언가 또는 무언가에 부딪쳤다는 것을 어떻게 알 수 있습니까?

그러나 문제는 다음과 같습니다 광선 중 하나가 true 될 것 boolean을 명중하고 "모든"광선이 명중하지 않는 경우, 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으로 시도하고는 동일했다.

광선 중 하나가 3 개를 맞으면 4 개의 광선이 나오므로 나에게 맞지 않으므로 4 개의 광선이 있습니다.

나는 당신이 만드는 방법을 가르쳐 수있는 경우 4 선에서 하나의 선이 booleantrue된다 명중하고 모든 사 광선이 명중하지 않는 경우가 false을하게되면 내가 씨앗으로 루프의 모든 방법을 마지막 선에 충돌하는 경우 .

+0

'Physics2D.Raycast'는 항상 널이 아닌'RaycastHit2D' 오브젝트를 리턴합니다 그래서'if (hit)'이 항상 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); 

     } 
    } 

을 발견 한 또 다른 답이있다

여기에서의 아이디어 부울 기본값은 거짓이다, 또한 당신이 함수를 호출 할 때마다 업데이트 그래서 당신은 부울이 true인지 체크하고, 맞지 않으면 자동 리턴을 false로 체크 할 필요가 없습니다.

관련 문제