TIL_2025_03_05 Raycast

김효중·2025년 3월 6일

Physics.Raycast

Raycast(Vector3 원점, Vector3 방향, 플로트 maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

Unity의 Physics.Raycast는 직선 Ray를 투영하고 특정 오브젝트에 적중되면 True를 반환한다.
이때 레이어 마스크를 통해 콜라이더를 선택적으로 필터링할 수 있습니다.

Raycast의 검출 조건

Physics.Raycast는 어디에서든 호출 할 수 있고, 검사하고자하는 대상은 다음 조건을 만족해야한다.

    1. 검사 대상은 Collider를 반드시 가지고 있어야한다. Trigger의 경우 기본적으로 검출되고 QueryTriggerInteraction에 따라 여부가 달라진다.
    1. 검사 거리 maxDistance 내에 존재해야한다.
    1. 검사 레이어 layerMask에 해당하는 레이어에 속해야 된다.

QueryTriggerInteraction는 UseGlobal, Ignore, Collide의 값을 가질 수 있으며
각각 충돌을 전역 설정에 따름, 무시, 허용 합니다.

사용 예시

RaycastHit hit;
if (Physics.Raycast(transform.position,
	transform.TransformDirection(Vector3.forward), 
    out hit, 
    Mathf.Infinity, 
    layerMask))
{ 
          Debug.Log("Did Hit"); 
}

위 코드는 기본 응용 코드로 자신 오브젝트의 정면으로 무제한 거리로 layerMask로 필터링을 하며 검사를 진행한다.
그리고 검사 결과를 hit에 반환하며 Debug.Log("Did Hit"); 문이 실행 된다.
이때 검사된 충돌체는 hit.collider.gameObject를 통해 사용할 수 있다.

예시 1 - 마우스 위치에서 검사

	Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, 100))
        print("Hit something!");

Ray는 원점과 방향을 가지는 구조체로 Raycast를 호출할 경우 원점과 방향에 대신 사용할 수 있다.
위 코드는 마우스 위치에서 100거리만큼 검사하는 예시이다.

예시 2 - 검사체와 거리 검사

RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0f))
    print("Found an object - distance: " + hit.distance);

위 코드는 아래 방향으로 100만큼의 거리만큼 검사를 진행하며 검출된 대상과의 거리를 출력합니다.

예시 3 - 화면 중앙 기준으로 검사

	Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit, maxCheckDistance, layerMask))
    {
        Debug.Log("Game Object : " + hit.collider.gameObject.name);
    }

위 코드는 카메라의 정중앙에서 발사하여 maxCheckDistance내에 있는 layerMask에 해당하는 오브젝트를 검사합니다.
그 후 검출된 오브젝트의 이름을 출력합니다.

참고
https://www.youtube.com/watch?v=RkJyyi6lmQ8&t=2s
https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Physics.Raycast.html

profile
도전하는 개발자

0개의 댓글