bdfgdfg

Raycasting / LayerMask 본문

게임프로그래밍/Unity

Raycasting / LayerMask

marmelo12 2021. 8. 5. 16:41
반응형

Raycasting

물리적인 광선을 쏘아내 충돌을 할 수 있게한다.

 

Physics라는 물리클래스안에 Raycast가 존재하고.

이것은 레이캐스트를 어느 시작점이 주어지면 그 시작점을 기준으로 내가 원하는 값을 넣어 그 방향을 향해 레이를 쏠 수 있다.

매우 많은 인자를 받을 수 있지만, 그 중 매우 간단한 인자버전.

위에서 말한 시작점과 방향값을 넣어줄 수 있다.

그리고. 이렇게 레이를 쏠 때, 어느 물체와 충돌했는지 안했는지를 판별할 수 있게 bool값을 리턴한다.

 

물론 레이를 맞은 대상의 정보를 가져올 수도 있다.

maxDistance는 레이 길이(크기)값을 넣어줄 수 있다.

참고로 out은 c#에서 내가 넘긴 인자에 결과값을 저장한다는 의미.

저 RaycastHit에 인자를 넘겨주기 위해. RaycastHit 변수를 만들고 넘겨준다.

 

void Update()
{
    // 눈에 보이는 Ray를 그려주기 위함.
    Debug.DrawRay(this.transform.position + Vector3.up, this.transform.forward * 10,Color.red);
        
    RaycastHit hit;
    if(Physics.Raycast(this.transform.position + Vector3.up, this.transform.forward, out hit, 10))
    {
        Debug.Log($"RayCast! {hit.transform.gameObject.name}");
    }
}

이렇게하면 밑의 사진과 같이 Ray를 쏘게된다.

콘솔을 확인해보면.

이렇게. 충돌한 대상을 확인할 수 있다.

 

다만 일반적인 Ray는 길이가 얼마나 됐건, 많은 오브젝트들과 레이와 충돌을 하더라도. 맨 처음 충돌한 대상의 정보만 가져온다.

 

이 때 사용하는게 RaycastAll

반환값이. Ray에 맞은 녀석들의 집합(배열)을 반환한다.

  void Update()
{
    Debug.DrawRay(this.transform.position + Vector3.up, this.transform.forward * 10,Color.red);
        
    RaycastHit[] hits;
    hits = Physics.RaycastAll(this.transform.position + Vector3.up, this.transform.forward, 10);
        
    foreach (RaycastHit hit in hits)
    {
        Debug.Log($"Raycast! {hit.transform.gameObject.name}");
    }
}

결과를 보면

레이를맞은 모든 오브젝트를 출력.

 

LayerMask

Physics내부의 Raycast 함수의 인자를 보면 layerMask라는 int형 변수를 건낼 수 있다.

이 layerMask는 비트플래그 방식을 이용한다.

 

layerMask를 사용하기 위해. 게임오브젝트의 Layer에 우리가 원하는 Layer값을 넣어주면 되는데.

Add Layer를 누르고

유저 레이어부터 (8) 우리가 원하는 것을 넣어 줄 수있다.

Monster라고하고 넣은 뒤.

 

여기서 말하는 8. (참고로 Layer는 0부터 31까지 있는데. 4바이트 크기로 비트플래그가 가능)

8은 8번째 비트를 대상으로 Monster라는 이름을 부여한다고 생각.

즉 Raycast의 인자로. 8번째 비트만 켜진 int형 값을 건네면 우리는 Monster라고 지정한 Layer를 대상으로만 Ray연산을 진행한다는 뜻.

(비트 플래그를 이용한 방식)

 

 int monsterMask = (1 << 8);
RaycastHit hit;
if (Physics.Raycast(this.transform.position + Vector3.up, Vector3.forward,out hit, 10.0f, monsterMask))
{
    Debug.Log($"Ray only Monster hit! {hit.transform.gameObject.name}");
}

 

반응형

'게임프로그래밍 > Unity' 카테고리의 다른 글

데이터 관리(Json)  (0) 2021.08.08
Coroutine(코루틴)  (0) 2021.08.08
Animation State패턴  (0) 2021.08.06
투영  (0) 2021.08.05
Input Manager / Resource Manager  (0) 2021.08.05
Comments