
Raycast(Vector3 원점, Vector3 방향, 플로트 maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
Unity의 Physics.Raycast는 직선 Ray를 투영하고 특정 오브젝트에 적중되면 True를 반환한다.
이때 레이어 마스크를 통해 콜라이더를 선택적으로 필터링할 수 있습니다.
Physics.Raycast는 어디에서든 호출 할 수 있고, 검사하고자하는 대상은 다음 조건을 만족해야한다.
QueryTriggerInteraction는 UseGlobal, Ignore, Collide의 값을 가질 수 있으며
각각 충돌을 전역 설정에 따름, 무시, 허용 합니다.
RaycastHit hit;
if (Physics.Raycast(transform.position,
transform.TransformDirection(Vector3.forward),
out hit,
Mathf.Infinity,
layerMask))
{
Debug.Log("Did Hit");
}
위 코드는 기본 응용 코드로 자신 오브젝트의 정면으로 무제한 거리로 layerMask로 필터링을 하며 검사를 진행한다.
그리고 검사 결과를 hit에 반환하며 Debug.Log("Did Hit"); 문이 실행 된다.
이때 검사된 충돌체는 hit.collider.gameObject를 통해 사용할 수 있다.
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, 100))
print("Hit something!");
Ray는 원점과 방향을 가지는 구조체로 Raycast를 호출할 경우 원점과 방향에 대신 사용할 수 있다.
위 코드는 마우스 위치에서 100거리만큼 검사하는 예시이다.
RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0f))
print("Found an object - distance: " + hit.distance);
위 코드는 아래 방향으로 100만큼의 거리만큼 검사를 진행하며 검출된 대상과의 거리를 출력합니다.
Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));
RaycastHit hit;
if (Physics.Raycast(ray, out hit, maxCheckDistance, layerMask))
{
Debug.Log("Game Object : " + hit.collider.gameObject.name);
}
위 코드는 카메라의 정중앙에서 발사하여 maxCheckDistance내에 있는 layerMask에 해당하는 오브젝트를 검사합니다.
그 후 검출된 오브젝트의 이름을 출력합니다.
참고
https://www.youtube.com/watch?v=RkJyyi6lmQ8&t=2s
https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Physics.Raycast.html