본문 바로가기
Unity 3D/Unity3D

[Unity3D] 레이캐스트 정리

by dbxxrud 2019. 10. 23.

 

레이 캐스트 - 눈에 보이지 않는 광선(Ray)을 쏘아서 해당 광선에 맞은 물체가 무엇인지 여부를 판단한 뒤 여러 가지 후처리를 하는 방식.

 

 

 

그림과 같이 광선의 발사 원점과 발사각, 그리고 거리 등의 인자로 광선을 발사할 수 있습니다. 주로 레이 캐스트는 FPS 장르 게임에서 사격 시 실제 총알이 날아가지 않고 발사와 동시에 적이 명중해서 혈흔 효과와 같은 이펙트를 연출하고 사망하는 방식으로 구현되는 방식에 흔히 사용되곤 합니다.

 

 

디아블로3

 

실제로 디아블로나 리지니 같은 쿼터뷰 시점 방식 게임에서도 플레이어를 마우스 왼쪽 클릭으로 조작해 이동시킬 때 마우스 포인트 위치로 레이 캐스트 해서 3차원 좌표값으로 읽어온 후 해당 좌표로 이동시킵니다.  

 

 

 


Physics.Raycast

 

유니티 DOCUMENTATION

 

Physics.Raycast 함수는 Ray를 투사해 조건에 맞는 객체가 닿게 되면 true 값을 반환합니다.  이 함수의 파라미터들을 살펴보면 

Physics.Raycast(Vector3 origin, Vector3 direction, float maxDistance, int layerMask, QueryTriggerInteraction)가 매개변수로 들어갑니다. 

레이 캐스트가 어떤 객체를 검출하기 위해서는 그 객체가 하나 이상의 콜라이더 컴포넌트를 가지고 있어야 해요. 즉, 콜라이더를 갖고 있는 모든 객체에 Raycast 가 반응합니다.

 

 

Physics.Raycast(원점 좌표, 발사 방향벡터, 도달거리, 검출할 레이어, 쿼리 트리거);

 

 

 

따라서 레이 캐스트가 특정한 객체에게만 반응하기 위해 별도의 레이어를 지정할 수 있다. 위 코드는 (원점, 발사 방향, 충돌 감지 hit, 거리(무한대), 검출 레이어)를 파라미터로 넣었습니다.

RaycastHit hit 은 레이 캐스트에 검출된 객체의 정보를 저장할 변수를 선언한 것입니다. 

 

Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);

이 코드는 레이를 씬뷰에서 보기 위해 로그를 찍어 보는 코드입니다.

 

유니티 DOCUMENTATION

 

DrawRay의 파라미터로는 DrawRay(원점, 방향, 컬러, 지속시간) 

 

 

씬뷰에서 확일 할 수 있는 레이

 

 


 

Z값을 사용하지 않는 레이 캐스트

 

위 내용과 별다른 차이는 없어요. 하지만 Z값의 사용 유무만이 다를 뿐입니다. 여기서 알아야 할 건 ScreenPointToRay 함수입니다.

 

유니티 DOCUMENTATION 

 

 

public Ray ScreenPointToRay(Vector3 pos)

 

ScreenPointToRay 함수는 Camera 클래스의 함수이며, 스크린 좌표를 인자로 넘겨주면 원점인 카메라에서 시작하여 터치 스크린에 닿은 마우스의 위치로 레이를 생성시켜줍니다.  (예를 들면 탭한 곳으로 무언가를 날리고 싶다던가 이동하고 싶다던가...)

위 예제에서 ScreenPointToRay의 인자로 Input.mousePosition을 넘겨주었는데 mousePosition 값을 그대로 사용할 수는 없어요. mousePosition값이 월드 좌표계가 아닌 스크린 좌표계이기 때문입니다. 하지만 ScreenPointToRay 함수는 스크린 좌표를 전달하면 카메라에서 스크린 좌표로 향하는 월드 좌표계로 벡터를 구할 수 있습니다. Input.mousePosition은 Vector3 타입이지만, Z값을 제외합니다. ScreenPointToRay의 반환 값으로 얻을 수 있는 Ray는 원점이 Main Camera의 좌표이며, 방향이 카메라에서 탭한 좌표로 향하는 벡터입니다. 

 

 

 

도움이 되었다면 댓글과 공감 부탁드립니다.