핵심 정리
if (Physics.Raycast(origin, direction, out RaycastHit hit, distance))
{
Debug.Log(hit.collider.name);
}구조 이해
Raycast의 개념과 주요 용도
Raycast는 한 점에서 특정 방향으로 보이지 않는 선을 쏘아 무엇을 맞았는지 검사하는 기능입니다. 총알 판정, 상호작용 대상 탐지, 마우스 클릭 대상 확인, 캐릭터 전방 장애물 감지 같은 문제에서 자주 쓰입니다. 결과는 RaycastHit에 담기며, 맞은 콜라이더, 충돌 지점, 노멀 벡터, 거리 등을 꺼낼 수 있습니다.
거리 제한과 레이어 마스크 활용
거리 제한과 레이어 마스크를 함께 쓰면 불필요한 충돌 검사를 줄이기 쉽습니다. 거리를 지정하면 일정 범위 내에서만 검사하므로 오브젝트가 많은 씬에서도 부하를 제어할 수 있습니다. 레이어 마스크를 쓰면 특정 레이어만 선택적으로 검사하여 의도하지 않은 콜라이더가 결과에 포함되는 문제를 방지합니다.
[SerializeField] private float interactDistance = 3f;
private void Update()
{
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, interactDistance))
{
if (hit.collider.CompareTag("Interactable"))
{
Debug.Log($"target = {hit.collider.name}");
}
}
}결과가 없을 때 점검 순서
Raycast가 맞지 않는 상황에서는 코드 오류보다 설정 문제인 경우가 많습니다. 대상 오브젝트에 Collider가 붙어 있는지, Layer 설정이 마스크와 일치하는지, 방향 벡터가 의도한 방향을 가리키는지, 최대 거리가 충분한지를 차례로 확인합니다. Debug.DrawRay를 이용해 씬 뷰에서 실제 레이 경로를 시각화하면 원인을 빠르게 찾을 수 있습니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 총알 판정, 전방 장애물 감지 | Physics.Raycast(origin, dir, out hit, dist) |
| 범위 안의 여러 오브젝트 검사 | Physics.RaycastAll 또는 SphereCast |
| 특정 레이어만 검사 | LayerMask 파라미터 추가 |
| 레이 경로를 씬 뷰에서 확인 | Debug.DrawRay(origin, dir * dist) |
| 충돌 지점·노멀·거리 접근 | hit.point, hit.normal, hit.distance |
주의할 점
Raycast가 맞지 않는 원인은 대부분 코드가 아니라 설정 문제입니다. 레이어·콜라이더·방향을 먼저 확인하세요.
// ❌ 검사 결과 확인 없이 hit 사용
Physics.Raycast(transform.position, transform.forward, out RaycastHit hit);
Debug.Log(hit.collider.name); // 맞지 않으면 NullReferenceException
// ✅ 반환값(bool)으로 충돌 여부 먼저 확인
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 10f))
{
Debug.Log(hit.collider.name); // 맞은 경우에만 접근
}
// ✅ 레이 시각화로 방향 디버깅
Debug.DrawRay(transform.position, transform.forward * 10f, Color.red);참고 링크
2 sources