05
23

Raycast란?

광선경로에 충돌체가 있는지 감지하기 위해 특정 방향의 점에서 보이지 않는 광선을 발사하는 과정
총을 쏘는 것이 한 예이다.
많이 쓰이는 정의
bool Raycast
(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float distance, int layerMask)
첫번째 매개변수: 월드 공간의 점
두번째 매개변수: 레이저를 쏘는 방향

위 두 변수로 Ray를 구성한다.
즉, Ray 데이터 형태의 변수로 위 두개의 변수를 대체할 수 있다.

예를 들어 아래처럼 가능하다.
Ray myRay = new Ray(Vector3 origin, Vector3 direction)
Physics.Raycast(myRay, out RaycastHit hitinfo, float distance, int layerMask)

세번째 매개변수: 어떤 오브젝트가 광선을 교차하는지 코드에서 쿼리
네번째 매개변수(선택): 광선의 길이, 생략하면 무한대
다섯번째 매개변수(선택): Raycast가 어떤 레이어를 가진 오브젝트와의 충돌을 검출할지를 지정하는 데 사용
Debug.DrawRay함수를 통해 실제 광선 길이를 씬 뷰에서 시각적으로 볼 수 있다.

Raycast 함수 사용시 LayerMask 활용

LayerMask는 비트 마스크로 표현되며, 각 비트는 특정 레이어에 대응된다.
이를 통해 Raycast가 특정 레이어만을 대상으로 충돌 검출을 수행하도록 할 수 있다.
LayerMask를 사용하여 Raycast의 충돌 대상을 제한하는 이점은?

1. 성능 개선
: Scene에는 수많은 게임 오브젝트가 존재할 수 있으며,
  모든 오브젝트에 대해 충돌 검출을 수행하는 것은 불필요한 연산이다.
  LayerMask를 설정하여 Raycast가 관심 있는 레이어만을 대상으로 충돌 검출을 수행하면 성능을 개선할 수 있다.
2. 정확도 향상
: 특정 레이어에 속한 게임 오브젝트와의 충돌만을 검출하고자 할 때,
  다른 레이어에 속한 오브젝트들의 영향을 제외할 수 있다.
  예를 들어, 적 캐릭터와 충돌을 검출하고자 할 때는 "적" 레이어에 대해서만
  Raycast를 수행하도록 LayerMask를 설정할 수 있다.
  • 사용방법
// 레이어 지정
LayerMask layerMask = LayerMask.GetMask("LayerName"); // 단일 레이어에 대한 LayerMask 생성
// 여러 레이어 지정
LayerMask layerMask = LayerMask.GetMask("Layer1", "Layer2"); // 여러 레이어에 대한 LayerMask 생성
// 비트 연산 사용
LayerMask layerMask = 1 << LayerMask.NameToLayer("LayerName"); // LayerMask를 비트로 직접 설정
// 예시
Ray ray = new Ray(origin, direction);
float maxDistance = 100f;
LayerMask layerMask = LayerMask.GetMask("LayerName");
RaycastHit hit;
if (Physics.Raycast(ray, out hit, maxDistance, layerMask))
{
    // 충돌한 오브젝트와의 처리
}

Raycast를 활용하는 예

정확한 물리처리를 요구할때 활용한다.

OntriggerEnter 나 OnCollisionEnter 같은 함수들은
메세지 기반 프레임 기반 처리이므로 조금 덜 정확하다.

바닥과의 충돌 체크를 할 때 아래에 광선을 쏴서 바닥을 검사하는 방식으로 활용된다.

Ray 활용

광선의 시작점(origin)과 방향(direction)을 가지고 있는 구조체

시작점(origin)은 Vector3 타입의 월드 포지션이며
방향(direction)은 직선의 방향을 나타낼 Vector3 타입의 법선 벡터
카메라 뷰포트 중앙에서 시작하는 Ray는 아래와 같이 생성 가능

Ray ray = Camera.main.ViewportPointToRay(new Vector3 (0.5f, 0.5f, 0)); // 0.5f값은 뷰포트의 중간값
스크린의 마우스 위치로 부터 Ray 생성 가능

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
1인칭 FPS 게임을 만들 때는
카메라가 찍고 있는 화면(뷰포트)상의 위치를 실제 게임 월드의 위치로 리턴해주는 함수를 활용

Vector3 rayOrigin
= playerCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0.0f));
Vector3 rayDir = playerCam.transform.forward;

 

COMMENT