I'm FanJae.

[20260526] Unity 정리 ( Raycast I ) 본문

Unity/Unity 초격차캠프

[20260526] Unity 정리 ( Raycast I )

FanJae 2026. 5. 26. 21:45

1. 정의

- RayCast는 특정 위치에서 특정 방향으로 보이지 않는 광선을 쏴서, 그 경로에 있는 Collider를 검사하는 기능이다.

- 내 앞에 뭐가 있는가?
- 마우스로 클릭한 위치에 무엇이 있는가?
- 바닥에 닿아 있는가?
- 시야에 장애물이 있는가?

- Ray가 Collider와 교차하면 true를 반환하고, RaycastHit를 통해 충돌 정보를 얻어올 수 있다.


2. 필요한 이유

- RayCast는 실제 물리 충돌이 일어나기 전에 검사를 하기 위해 사용한다.

- 플레이어 앞 상호작용 오브젝트 감지
- 바닥 체크
- 벽 감지
- 시야 체크
- 총알 히트 스캔
- 마우스 클릭 대상 판별
- 장애물 감지

- 즉, RayCast는 부딪힌 뒤에 처리하는게 아니다. 미리 확인하는 것이다.


3. 기본 구조

Physics.Raycast(origin, direction, out RaycastHit hit, distance);

- 각 인자의 의미는 다음과 같다.

origin - Ray 시작 위치
direction - Ray 방향
hit - 충돌한 대상의 정보
distance - Ray 검사 거리
[SerializeField] private float rayDistance = 5.0f;

private void Update()
{
    RaycastHit hit;

    if (Physics.Raycast(transform.position, transform.forward, out hit, rayDistance))
    {
        Debug.Log("감지된 오브젝트 : " + hit.collider.name);
    }
}

- 앞 쪽으로 길이 5만큼의 ray를 발사하여, 감지된 오브젝트를 체크한다.


4. RaycastHit

- RayCast에 성공하면 RaycastHit을 통해 충돌 정보를 얻을 수 있다.

if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, rayDistance))
{
    Debug.Log(hit.collider.name);
    Debug.Log(hit.point);
    Debug.Log(hit.normal);
    Debug.Log(hit.distance);
}

- RaycastHit의 주요 정보는 다음과 같다.

hit.collider - 맞은 오브젝트의 Collider
hit.point - Ray가 충돌한 월드 좌표
hit.normal - 충돌한 표면의 법선 벡터
hit.distance - origin부터 충돌 지점까지의 거리

- 예를 들어, hit.normal은 벽이나 바닥의 방향을 판단할 때 사용할 수 있다.

바닥 normal   → 위쪽 방향
벽 normal     → 벽이 바라보는 방향
경사면 normal → 경사면의 수직 방향

5. Debug.DrawRay

- RayCast는 눈에 보이지 않는다.

- 따라서 디버깅할 때는 Debug.DrawRay를 같이 사용하는 것이 좋다.

Debug.DrawRay(transform.position, transform.forward * rayDistance, Color.red);
private void Update()
{
    Debug.DrawRay(transform.position, transform.forward * rayDistance, Color.red);

    if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, rayDistance))
    {
        Debug.Log("감지된 오브젝트 : " + hit.collider.name);
    }
}
  • 주의할 점은 Debug.DrawRay는 실제 충돌 검사를 하는 코드가 아니라, Scene View에서 Ray 방향을 확인하기 위한 디버깅용 코드라는 점이다.

6. Ray 방향 관련 주의 사항

- RayCast에서 자주 실수하는 부분이 direction이다.

transform.forward

- 위 값은 현재 오브젝트가 바라보는 앞 방향을 의미한다.

- 예를 들어 플레이어 앞을 검사하려면 아래와 같이 작성한다.

Physics.Raycast(transform.position, transform.forward, out hit, rayDistance);

- 이런식으로, RayCast는 어느 방향으로 쏠지가 더 중요하다.


7. 거리 제한

- Ray는 개념적으로 무한히 뻗는 선처럼 생각할 수 있지만, 실제 게임에서는 성능 관리 및 상호작용 가능 거리 제한 등을 고려하여 거리를 제한해서 사용하고 있다.

Physics.Raycast(transform.position, transform.forward, out hit, 5.0f);

8. Physics.RaycastAll

- 기본 Physics.Raycast는 일직선상에 여러 오브젝트가 있어도 처음 맞은 오브젝트 하나만 반환한다.

- 여러 오브젝트를 모두 검사하고 싶다면 Physics.RaycastAll을 사용한다.

RaycastHit[] hits = Physics.RaycastAll(transform.position, transform.forward, rayDistance);

foreach (RaycastHit hit in hits)
{
    Debug.Log("감지된 오브젝트 : " + hit.collider.name);
}

- Ray 경로에 있는 여러 대상을 확인해야 할 때 사용한다.

- 일반적으로 Raycast는 가장 첫 번째로 맞은 Collider만 확인하는 반면, RaycastAll은 모든 Object를 확인한다.

Comments