유니티 레이캐스트와 레이캐스트 마스크 (Unity Raycast mask)

 

Raycase를 사용할 때는 ray를 밖에서 선언하고 사용하는 방법과 별도로 선언하고 넘기는 방법이 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public void Update()
{
    float l_rayDistance = 2f;
 
    // ray를 밖에서 선언하는 방법
    Ray ray = new Ray(transform.position, transform.forward);
    if (Physics.Raycast(ray, out RaycastHit hit, l_rayDistance))
    {
        
    }
    
    // ray를 별도로 선언하지 않고 넘기는 방법
    if (Physics.Raycast(transform.position, transform.forward, out RaycastHit l_hit, l_rayDistance))
    {
 
    }
}

 

 

스크린의 위치로 레이를 발사하는 방법도 있으니 참고.

 

1
2
// 마우스 위치를 ray로 변환한다.
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

 

 

Ray를 외부로 쓰면 Debug.DrawRay를 쓸 때 ray 값을 가져올 수 있어서 편하다.

 

1
2
3
4
5
6
7
8
9
10
11
 public void Update()
{
    // ray를 밖에서 선언하는 방법
    Ray ray = new Ray(transform.position, transform.forward);
    Debug.DrawRay(ray.origin, ray.direction * l_rayDistance, Color.red, 5f); // 디버그 레이
 
    if (Physics.Raycast(ray, out RaycastHit hit, l_rayDistance))
    {
 
    }
}

 

 

 

 

#. 레이캐스트 마스크 예제.

 

레이어 마스크의 경우 int 형식으로 선언되어있지만 비트 연산을 통한 레이어 마스크를 정의한다.

따라서 두개 이상의 레이어를 검출하고 싶다면

 

+가 아니라 | 를 써줘야한다. (논리적 OR을 뜻하는 || 가 아니라 비트연산에서 OR을 뜻하는 | 이다)

 

LayerMask는 int 값으로 선언해야 한다! 주의할 것!

LayerMask 라는 structure가 존재하는데다가 아래의 코드에서 int를 LayerMask로 써도 오류가 출력되지 않으니 주의.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public void Update()
{
    float l_rayDistance = 2f;
 
    // ray를 밖에서 선언하는 방법
    Ray ray = new Ray(transform.position, transform.forward);
    // Wall 레이어와 PlayerWall 레이어만을 검출한다.
    int layerMask = 1 << LayerMask.NameToLayer("Wall"| 1 << LayerMask.NameToLayer("PlayerWall");
 
    Debug.DrawRay(ray.origin, ray.direction * l_rayDistance, Color.red, 5f); // 디버그 레이
 
    if (Physics.Raycast(ray, out RaycastHit hit, l_rayDistance, layerMask))
    {
 
    }
}

 

public void Update()
{
    float l_rayDistance = 2f;
 
    // ray를 밖에서 선언하는 방법
    Ray ray = new Ray(transform.position, transform.forward);
    // Wall 레이어와 PlayerWall 레이어만을 검출한다.
    int layerMask = 1 << LayerMask.NameToLayer("Wall") | 1 << LayerMask.NameToLayer("PlayerWall");
 
    Debug.DrawRay(ray.origin, ray.direction * l_rayDistance, Color.red, 5f); // 디버그 레이
 
    if (Physics.Raycast(ray, out RaycastHit hit, l_rayDistance, layerMask))
    {
 
    }
}

 

 

만약 제외하고싶은거라면

~layermask 를 써주면된다. (비트연산 NOT)

 

layerMask  = ~layerMask ;

 

전체중에 두개를 제외하고 싶다면 | 연산으로 비트OR을 구한다음에 layerMask  = ~layerMask ; 를 사용하면된다.

 

댓글

Designed by JB FACTORY