Unity의 Raycast

Hyeon O·2025년 5월 16일

개요

Raycast 기능을 탐구하고, 기본 개념의 이해를 바탕으로 활용 방법을 정리해보자.

Raycast란?

Raycast는 Unity 물리 엔진에서 사용하는 기능으로,

하나의 점에서 특정 방향으로 쏜 ‘가상의 레이(광선)’가 무엇과 충돌하는지를 확인하는 방식이다.

코드 기본 구조를 보고 이해해보자.

Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, floaty maxDistance, int layerMask)

bool 타입으로 반환하는 메서드의 형태로 파라미터는 다음과 같다.

매개변수설명
origin광선 시작 지점
direction광선 방향 (반드시 normalized 벡터 사용)
hitInfo충돌 정보를 담는 구조체 (RaycastHit)
maxDistance광선이 도달할 최대 거리
layerMask충돌 감지할 레이어 필터 (선택 사항)

여기서 RaycastHit 구조체를 좀 더 살펴볼 필요가 있다.

RaycastHit 구조체

이 구조체는 충돌한 대상에 대한 상세 정보를 감고 있으며

다음과 같은 속성을 지닌다.

속성설명
collider충돌한 Collider
point충돌 지점 (월드 좌표)
normal충돌 표면의 법선 벡터
distanceorigin에서 충돌 지점까지 거리
rigidbody충돌한 객체의 Rigidbody
transform충돌한 객체의 Transform
if (Physics.Raycast(origin, direction, out RaycastHit hit, 100f))
{
    // 예시: 정보 얻기
    Collider targetCollider = hit.collider;                // 충돌한 콜라이더
    GameObject targetObject = hit.collider.gameObject;     // 충돌한 게임오브젝트
    Transform targetTransform = hit.transform;             // Transform 직접 접근 가능
    Rigidbody rb = hit.rigidbody;                          // Rigidbody 있으면 가져옴
    Vector3 hitPoint = hit.point;                          // 충돌 위치
    Vector3 normal = hit.normal;                           // 충돌 표면의 법선
    float distance = hit.distance;                         // origin부터 충돌점까지 거리
}

🧐bool을 반환하는데 어떻게 충돌 대상에 대한 정보를 받아올 수 있지?
→ out 키워드를 통해 충돌 시 hit에 정보를 담아서 넘겨주기 때문
out 키워드를 까먹지 말자


Raycast 사용 예제 코드

[기본적인 사용 예시 코드]

void Update()
{
	//현재 오브젝트의 위치에서 전방 방향으로 레이 생성
    Ray ray = new Ray(transform.position, transform.forward);
    //충돌 결과를 담을 빈 구조체 선언
    RaycastHit hit;
		
		//레이를 쏴서, 100f 거리 내에서 충돌이 있다면 
    if (Physics.Raycast(ray, out hit, 100f))
    {
		    //충돌한 오브젝트의 이름 출력
        Debug.Log("Hit: " + hit.collider.name);
    }
}

[마우스 클릭으로 대상 감지]

//레이 생성, 근데 카메라 위치에서 마우스 클릭 위치 방향으로
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

//레이가 무언가와 맞았다면
if (Physics.Raycast(ray, out RaycastHit hit))
{
		//충돌한 오브젝트 이름 출력
    Debug.Log("Clicked on: " + hit.collider.name);
}

[특정 레이어만 반응하는 Raycast]

//레이어 마스크 생성
int layerMask = LayerMask.GetMask("Enemy");

//50거리 안에서 위 레이어가 달린 오브젝트가 맞았다면
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 50f, layerMask))
{
		//그 오브젝트 이름 출력
    Debug.Log("Hit enemy only: " + hit.collider.name);
}

[조준 시스템]

//플레이어 전방으로 100 거리 내애서 뭔가 맞았다면
if (Physics.Raycast(player.position, player.forward, out RaycastHit hit, 100f))
{
		//충돌 지점의 위치를 가져와 조준점을 해당 위치에 표시
    crosshair.position = hit.point;
}

[디버깅 용 Ray 시각화 코드]

//10 거리만큼 빨간색 가상의 선을 그림
Debug.DrawRay(transform.position, transform.forward * 10f, Color.red);
profile
천천히, 꾸준하게, 끝까지

0개의 댓글