본문 바로가기
게임개발/유니티 엔진

Raycast

by do_ng 2024. 2. 19.

Ray란?

 

방향(direction)과 원점(origin)을 나타내는 것으로 원점(origin)은 ray가 시작하는 world 세상의 position이다. 

방향(direction)은 정규화(normalized)된 Vector3(x, y, z)의 형태의 궤적을 사용한다.

Vector를 정규화 하면 Vector의 길이인 magnitude(크기)가 1로 바뀌고 방향만을 가리키는 Vector로 사용된다.

(Vector는 크기와 방향을 갖는 화살표)

 

Ray를 만드는 방법

// Creates a Ray from the mouse position
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

화면에 있는 마우스 위치에서 ray를 만듬

만약 Ray의 origin과 direction이 every frame 마다 달라진다면 Ray도 매 프레임마다 update 해야 한다. 

 

How to use the RaycastHit variable

RaycastHit은 ray와의 collision에 대한 정보를 저장하는 데이터 구조체로 

world에서 hit(충돌)이 발생한 위치, ray와 충돌한 object가 무엇인지에 대한 정보, ray의 orgin에서 얼마나 멀리 떨어져 있는지에 대한 정보를 가지고 있다.

 

RaycastHit hit; 
if (Physics.Raycast(ray, out hit))
{
    destPos = hit.point;            
    moveToDest = true;
    // Debug.Log($"Raycast Camera @{hit.collider.gameObject.name}");
}

RaycastHit에는 ray에 최초로 부딪힌 object에 대한 정보가 저장됨

실제로 Scene에 Ray를 발사하고 Ray가 무엇에 부딪치는지 확인하려면 "Raycast" 메소드를 사용해야 한다.

 

How to use Raycast function

// create ray
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

RaycastHit hit; 
if (Physics.Raycast(ray, out hit))
{
    destPos = hit.point;                
}

 

Physics 클래스의 Raycast 메소들르 사용해서 생성한 ray가 발사되고 ray에 최초로 충돌한 object를 hit에 저장한다.

 

Raycast 메소드의 return 타입은 bool 인데, overload 방식에 따라서 hit 되는 방식이 달라진다.

 

ray를 쏘는데 최초로 충돌한 object가 있으면 true를 return

RaycastHit hit; 
if (Physics.Raycast(ray, out hit, 100.0f))
{
    destPos = hit.point;                
}

 

ray를 쏘는데 ray와 충돌한 object가 있어도 그 object가 "Wall" 아니라면 무시하고 최초로 "Wall" object와 충돌하는 경우에만 true를 return

RaycastHit hit; 
if (Physics.Raycast(ray, out hit, 100.0f, LayerMask.GetMask("Wall")))
{
    destPos = hit.point;                
}

이런식으로 LayerMaks를 사용해서 ray가 여러 개의 object와 충돌하는 경우 일부에 대해서만 충돌을 감지할 수 있게 설정할 수 있다.

 


참고 : https://gamedevbeginner.com/raycasts-in-unity-made-easy/