유니티에는 레이캐스트라고 해서 마치 레이저를 쏴서 오브젝트를 인식하는 시스템이 존재한다.
이러한 레이캐스트는 사실 굉장히 많은 연산이 수반되는 물리적 방식이다.
따라서 유니티에서 기본적으로 제공하는 Physics라는 클래스에 Raycast라는 함수로 존재하고 있다.
그래서 우리가 레이캐스트를 사용할 때 Physics.Raycast 라는 방식으로 호출해서 사용하는 것이다.
유니티 공식 홈페이지의 내용을 확인해보고 싶으면 아래의 링크를 클릭하면 된다.
위의 링크를 확인해봤으면 알 수 있지만, 레이캐스트의 종류는 굉장히 많다.
놀랍게도 여기위에 적혀있는 것들 대부분이 레이캐스트이다. (레이캐스트는 레이저를 말하므로, 엄밀히 말하면 레이캐스트는 아니지만..)
아무튼 뭐, BoxCast 라느니 SphereCast 라느니 등등이 있는데 딱히 다른점은 없고 차이점이라면
BoxCast는 레이저대신에 박스를 쏘는 거고 SphereCast는 구체를 쏜다고 생각하면 된다.
뭘 굳이 이렇게까지 나눠놓나 싶을수도 있겠지만, 나름 각각 쓸모가 있는 모양이다.
따라서 다 똑같다고 생각하면 되므로 우리는 Raycast와 RaycastAll 2가지만 제대로 알아두면 된다.
실제로도 이 2가지면 모든 걸 다 할 수 있다.
Raycast
레이캐스트는 그 결과를 bool로 반환해준다.
즉, 레이캐스트에 충돌된 오브젝트가 있는지 없는지에 따라서 true/false를 반환하므로 if문에서도 종종 사용된다.
유니티에서 스크립트를 생성해서 raycast를 쳐보면 무려 16가지의 오버로딩이 존재한다.
그러다보니까 레이캐스트를 처음 사용하는 사람들 입장에서는 막막해질 수 있다.
일단, 항상 나는 어렵더라도 공식문서를 한번쯤은 살펴보는 것을 추천한다.
다양한 상황에서 사용할 수 있도록 준비되어있는 것이므로
입력되는 매개변수들이 어떤것들이 있는지 파악하여 필요한 대로 사용하면 된다.
크게 Ray를 쓰는 방식과 Ray를 사용하지 않는 방식으로 나뉜다.
1. Ray를 쓰는 방식
위와같이 매개변수로 Ray가 들어가는 경우다.
Ray를 직접 매개변수로 넣어주고 싶다면, 직접 생성한 ray를 넣어주면 된다.
Ray ray = new Ray(); 뭐 이런식으로 생성한뒤에 ray를 알맞게 설정해주면 되는데, 개인적으로는 잘 안쓰고 다른 방식을 선호한다.
ray의 경우는 시작점과 방향을 설정해줘야하기때문에,
ray.origin 과 ray.direction 에 값을 넣어주면 된다.
이 방식의 경우는 ray를 또 한번 만들어주는 과정을 코딩해야하기 때문에 개인적으로는 선호하지 않는다.
ray를 매개변수로 사용하지 않는 방식을 추천한다.
2. Ray를 매개변수로 쓰지 않는 방식
이 경우에는 ray 대신에
Vector3 origin 과 Vector3 direction 을 매개변수로 입력해줘야한다.
사실상 ray를 생성할 때 시작점과 방향을 넣어줘야하는데 이 경우에는 그 과정까지도 알아서 수행해준다.
함수 내부에서 아마 ray를 직접 생성하는 것이므로 개발자 입장에서는 훨씬 편리하다.
이렇게 광선의 발사지점과 방향을 설정해주면 레이캐스트를 쏠 수 있다.
이 밖에도 매개변수들이 존재하는데 공통적이므로 한번씩만 살펴보면 된다.
float maxDistance : 레이캐스트의 최대거리
int LayerMask : 충돌을 인식할 레이어
위 2가지를 사용해서 어떤 레이어의 오브젝트를 인식할건지, 얼마만큼의 거리까지 인식할 것인지를 설정한다.
그리고 RaycastHit hitInfo를 사용해서 충돌된 오브젝트의 정보를 가져올 수 있다.
이 매개변수는 out으로 되어있기 때문에 기본적으로 out 문법을 알아야한다.
간단히 설명하면, 해당 함수가 입력된 매개변수를 가지고 연산을 마친뒤에 그 결과값을 입력해줬던 값으로 되돌려준다.
따라서 hitInfo 매개변수를 사용해서 충돌한 오브젝트의 정보를 받아올 수 있다는 뜻이다.
이 매개변수를 사용하기 위해서 RaycastHit hit이라는 변수를 하나 생성해주고 매개변수로 넣어주면 된다.
그러면 충돌된 오브젝트의 정보가 hit 변수에 담기게 되므로 이 hit을 사용해서,
해당 오브젝트의 이름을 얻거나 위치를 바꾸거나 상태를 바꿀 수 있을 것이다.
RaycastAll
RaycastAll은 위에서 살펴본 레이캐스트와 거의 동일하다고 보면 된다.
차이점은 이름에 All이 붙어있는 것처럼, 반환값이 RaycastHit를 배열로 반환해준다.
bool값 하나를 반환하던 레이캐스트와는 다른 점이다.
이거 말고는 큰 차이점이 없으므로, 레이캐스트를 쓰던것과 동일한 방식으로 사용하면 된다.
레이캐스트는 거의 모든 게임에서 필수적으로 사용되는 기능이다.
따라서 반드시 알아두어야하는 부분이기 때문에 반복적으로 숙달하는 것이 매우 중요하다.
'유니티 Unity > 유니티 기능 구현' 카테고리의 다른 글
[유니티] 파일을 저장하거나 불러오는 방법 - System.IO.File (0) | 2022.01.25 |
---|---|
[유니티] 초보자를 위한 제이슨을 사용하는 방법 (3) | 2022.01.15 |
[유니티] 비디오플레이어로 UI에서 동영상 재생하기 (1) | 2022.01.06 |
[유니티] 서버(인터넷)에서 이미지 가져와서 사용하는 방법 (0) | 2022.01.04 |
[유니티] 코루틴의 사용법 총정리 - Unity Coroutine (2) | 2021.12.05 |
댓글