I'm FanJae.
[20260526] Unity 정리 ( Raycast I ) 본문
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를 확인한다.
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260527] Unity 정리 ( Overlap 계열, Check 계열 ) (0) | 2026.05.27 |
|---|---|
| [20260527] Unity 정리 ( Unity Raycast 응용 : LayerMask, Tag, Raycast를 이용한 상호작용 ) (0) | 2026.05.27 |
| [20260526] Unity 정리 ( Prefab ) (0) | 2026.05.26 |
| [20260522] Unity 정리 ( Collider 충돌 처리 기초 - Collision, Trigger ) (0) | 2026.05.22 |
| [20260522] Unity 정리 ( Unity 물리 엔진 기초 - Rigidbody ) (0) | 2026.05.22 |