2016-12-13 4 views
1

2 포인트 사이에 벽이 있는지 여부에 따라 true 또는 false를 반환하는 간단한 DirectPath bool 함수가 있습니다.Unity2에서 Physic2D.Linecast()와 함께 layerMask 사용하기 C#

public bool DirectPath (Vector2 start, Vector2 end) { 

    RaycastHit2D hitWall = Physics2D.Linecast (start, end, 8); 

    if (hitWall == null) { 
     Debug.Log ("Direct path returning true"); 
     return true; 
    } else { 
     Debug.Log ("Direct path returning false"); 
     return false; 
    } 
} 

나는 나의 레이어 목록에서 숫자 8 게임에 "벽"의 모든 벽 colliders의 layerMask을 설정했습니다. 하지만이 함수는 매번 false를 반환합니다. 즉, 매번 벽 충돌자가 충돌하고 있음을 의미합니다. "시작"지점도 충돌 자 내부에 있지 않으므로 자체 충돌자를 치는 것이 불가능할 수 있습니다. 하지만이 동일한 기능을 사용하여 플레이어의 시선을 결정하고 싶습니다. 따라서 충돌자가 포함됩니다.

+0

,하지만 난 7을 시도하고 여전히마다 false를 반환한다. hitwall.collider.gameObject.name이 무엇인지 보았습니다 만 아무 것도 반환하지 않습니다. 그것이 실제로 부딪히는 것을 확인하는 올바른 방법입니까? –

답변

4

귀하의 문제는이 라인에 :

RaycastHit2D hitWall = Physics2D.Linecast (start, end, 8); 

다음과 같이가 있어야한다 :

RaycastHit2D hitWall = Physics2D.Linecast (start, end, (1<<8)); 

이유는 무엇입니까? 그 인수는 레이어 마스크, 즉 인덱스가 아닌 레이어의 비트 마스크를 원하기 때문입니다.

이 인수는 단 하나의 레이어 만 필요로하지 않으므로 마스크의 비트 순서에 따라 정의 된 여러 레이어에 대해 캐스팅 할 수있는 옵션을 제공합니다 (모든 비트는 사용자가 만든 비트를 제외하고는 0입니다). 이것은 당신이 마스크를 결합하고, 8 레이어를 제외한 모든 레이어에 대해 캐스트 ~(1<<8) 등의 작업을 수행 할 수 있습니다

관련 문서 : https://docs.unity3d.com/Manual/Layers.html

편집 :

추가적인 문제가 RaycastHit2D이 구조체 유형이 있다는 것입니다 . 즉, 항상 null이 아님을 의미합니다.

당신은 확인 할 if (hitWall.collider == null) {

참조 : http://answers.unity3d.com/questions/691622/why-does-raycast2d-always-return-non-null.html 그것은 0을 기반으로 @AlfieGoodacre

+0

고마워,하지만 나는 매번 여전히 거짓말을하고있다. –

+0

다음을 확인하십시오. 자신을 치지 않고 시작과 끝점을 확인하고, colliers 구성을 확인하십시오 (정확하게 색인을 계산했는지 확인하십시오). 마지막으로, 뭔가를 치는 경우, 무엇을 치는지 확인하십시오. (gameobject.name을 인쇄 해보십시오.) – code11

+0

Debug.Log ("직접 경로 반환 false"+ hitWall.collider.gameObject.name) 아무 것도하지 않습니다. 콘솔에서 인쇄합니다 ... –