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 구조체를 좀 더 살펴볼 필요가 있다.

이 구조체는 충돌한 대상에 대한 상세 정보를 감고 있으며
다음과 같은 속성을 지닌다.
| 속성 | 설명 |
|---|---|
collider | 충돌한 Collider |
point | 충돌 지점 (월드 좌표) |
normal | 충돌 표면의 법선 벡터 |
distance | origin에서 충돌 지점까지 거리 |
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 키워드를 까먹지 말자
[기본적인 사용 예시 코드]
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);