콜라이더를 통해 충돌을 처리할 때 문제가 생기는 부분이 있다.
충돌 감지는 매 프레임마다 물체가 겹치는지를 확인해서 이루어지는데 물체의 속도가 너무 빠른 경우 이전 프레임과 다음 프레임 사이에서 두 물체가 겹치는 부분이 없어 충돌이 이뤄지지 않고 관통해버리는 일명 Bullet Through Paper Problem 라는 문제가 생기게 된다.
이런 경우에 충돌을 감지하기 위해서 Raycast를 많이 사용한다고 한다. 대표적인 예로 총알과 같은 투사체가 있다.
또 콜라이더끼리의 충돌은 겹침을 확인해서 일어나기 때문에 정확히 어떤 곳에 충돌이 이뤄지는지 알 수 없지만 Raycast는 그 지점을 정확히 알아낼 수 있기 때문에 충돌 지점에 대한 처리를 해야하는 경우에도 Raycast를 많이 사용한다.
Raycast는 물체에서 레이저를 쏴서 맞는 물체가 있는지 확인하는 방법으로 원하는 방향과 거리만큼 미리 확인할 수 있다는 장점이 있다. 다만 한 점에서 Ray를 쏘는 것이기 때문에 충돌 표면에 대한 처리가 어렵다는 단점이 있다.
사용은 Physics.Raycast 함수를 통해 사용한다.
위 함수 말고도 오버로딩된 함수들이 많이 있다.
RaycastHit hit;
// Does the ray intersect any objects excluding the player layer
if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity, layerMask))
일반적인 사용은 이렇게 한다.
RaycastHit에는 Raycast에 명중된 오브젝트에 대한 정보들이 들어가 있다.
RaycastAll 함수를 통해 Ray 적중한 모든 물체를 검출할 수도 있다. 이 때는 RaycastHit도 배열등으로 사용한다.
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);
해당 코드를 통해 레이캐스트를 에디터 내에서 직접 살펴볼 수 있다.
빠른 속도로 이동하는 물체, 정확한 충돌 지점을 알아야 하는 경우엔 이 Raycast를 쓰고 아닐 경우엔 콜라이더에서 충돌 판정을 하도록 하자.