본문 바로가기

[Unity] 유니티 2D 레이캐스트로 충돌 판정 처리하기

Kwonriver 2023. 1. 9.
728x90

 

유니티 내에는 충돌과 관련해 상태를 변경할 수 있는 방법이 많이 있지만 Raycast를 이용하여 충돌을 체크하는 방법을 사용해본다. 

 

Raycast에서 Ray란 특정 좌표에서 방향과 길이를 가진 광선을 의미한다. Raycast는 이러한 Ray와 부딪힌 오브젝트(객체)가 있는지 체크하는 기능을 말하며 유니티 내에서 기본적으로 콜리전이 있어야 Raycast에 체크된다. 

 


먼저 Debug.DrawRay를 이용하여 일정한 광선을 발사해보자.

빨간색 선이 Ray

 

Debug.DrawRay 함수는 Debug 안에 있기 때문에 Game패널에서는 나타나지 않고 Scene에서만 나타난다. 즉, 디버깅 용도에서만 렌더되기 때문에 실제 게임이 출시되었을 때 유저가 볼 일은 없다.

FixedUpdate에서 호출하였는데 Update에서 호출해도 문제는 없다. 첫번째 인자는 시작 좌표, 두번째 인자는 Ray의 방향과 크기, 세번째 인자는 Draw할 광선의 색상이다. 즉, 아래 방향으로 광선을 발사했다. 

 


Ray에 대해 알아보았으니 레이캐스트를 사용해보자. 물리와 관련된 부분이기 때문에 FixedUpdate에서 동작시킨다. 

 

RaycastHit2D hit = Physics2D.Raycast(rigid.position, Vector3.down, 1);
if (hit.collider != null)
{
    Debug.Log(hit.collider.name);
}

hit은 레이캐스트에 의해 충돌된 객체와 관련한 정보를 가지고 있다. Physics2D.Raycast 함수에 의해 충돌 체크되는 객체는 단 1개이기 때문에 여러 객체의 동시 충돌 상태 체크를 알기 어렵다.

 

Property 설명
centroid Ray와 충돌한 오브젝트의 중심점
collider Ray와 충돌한 오프젝트
distance Ray의 원점에서부터 충돌체까지의 거리
normal Ray가 닿은 위치의 법선 벡터
point Ray가 닿은 위치의 좌표
rigidbody 추충돌된 객체의 Rigidbody2D
transform 충돌된 객체의 transform

 

어떠한 객체와 충돌 시 객체의 이름이 나타나게 만들었는데 문제는 기본적으로는 어떤 객체든 충돌하다는 것이다. 즉, 컴포넌트를 가지고 있는 자기 자신도 체크하게 되기 때문에 해당 컴포넌트를 가지고 있는 객체가 먼저 체크된다.

 

해당 컴포넌트를 가지고 있는 Player만 충돌체크가 되어버리는 모습

 

이를 해결하기 위해 LayerMask를 사용한다.

인스펙터 창 상단에 보면 Layer가 Default로 되어 있는 모습을 볼 수 있다. 이 Layer는 물리 연산을 돕기 위한 것으로 특정 Layer에 존재하는 객체만 체크하는 등의 용도로 사용한다. 기본적으로 5개가 세팅되어 있으며 바닥 객체만을 처리하기 위해 Add Layer를 하자.

 

User Layer 6에 바닥을 묶어줄 Layer로 Platform 이름을 세팅한다. 그 다음 모든 바닥의 Layer를 Platform으로 변경한다.

 

모든 바닥의 Layer를 Platform으로 변경하였다면 이제 Raycast를 진행할 때 특정 Layer인 객체만 체크하도록 수정한다.

Physics2D.Raycast에 오버로딩된 함수 중에 4번째 인자로 레이어 인덱스를 받는 함수가 있다. 여기에 6을 바로 넣는 것이 아닌 이름을 사용해 레이어 번호를 가져오는 함수를 사용한다.

 

 

Player가 나오던 이전과 달리 Floor 가 나온다. 이렇게 Ray를 이용하여 객체 충돌 체크를 할 수 있다. hit.distance를 이용하면 각 객체간의 거리를 알 수 있기 때문에 특정 값 이상으로 가까워졌을 때 추가적인 처리를 할 수 있다.

 

 

 

 

[Unity] Physics.Raycast 완벽 가이드

들어가며 Unity의 Physics.Raycast는 직선을 씬에 투영하여 대상에 적중되면 true를 리턴하는 물리 함수다. Raycast 함수는 캐스팅 성공 실패에 따른 결과만 리턴하는 간단한 형태에서 부터 대상과 Ray의

kukuta.tistory.com

 

728x90