Unity 개발일지

[Unity] RayCast(레이캐스트) 본문

Unity 개발

[Unity] RayCast(레이캐스트)

아머르 2024. 5. 27. 20:16

[RayCast 란?]

눈에 보이지 않는 광선(Ray)에 맞은 물체가 무엇인지 여부를 판단한 뒤 여러 가지 후처리를 하는 방식.

Ray, RaycastHit, MaxDistance, LayerMask 등의 옵션을 가지고 있다.

 

카메라(출발점) 에서 Ray를 쏜 후 Collider에 부딪히면 RayCastHit으로 검출된 객체의 정보를 알 수 있다.

Collider(충돌)을 검출해야하므로 Physics를 이용한다.

 

 

 

[한번 쏴보자]

 

Laycast를 관리해줄 Manager를 하나 만들어주었고,

RaycastSceneManager 스크립트를 만들어 붙여주었다.

 

아래 스크립트설명에 작성하겠지만

Ray는 Square에서 쏠 것이므로 SquareTransform은 Square로 해주었다.

 

Square 2D오브젝트를 만들어주었고 BoxCollider2D를 붙여주었다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Wall 2D오브젝트를 만들어주었고 BoxCollider2D를 붙여주었다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Camera와 Transform을 정의해주고 Start에서 카메라를 가져와주었다.

 

 

RaycastHit2d는 부딪힌 물체의 정보를 알 수 있다.

 

 

아래 Scene을 보면 알 수 있겠지만 Physics2D.Raycast로 Square의 왼쪽으로 Ray를 쏴주었고,

부딪힌 물체의 이름을 출력하도록 Debug해주었다.

 

 

[왜 나랑 부딪히지?]

 

시작해주었더니 Square가 뜬다.

그 이유는 Ray의 시작 위치가 Square 중앙이기 때문에

Square의 Collider와 부딪혀서 검출된 것

 

 

 

 

 

 

 

raySquare로 ray의 시작 위치를 바꿔주었다.

Square의 x좌표에서 Square Sprite의 size의 0.6배 만큼 빼준(왼쪽으로 쏠거니까) 지점으로 설정했다.

 

 

Wall이 잘 나온다!

 

 

 

 

 

 

 

 

 

 

[여러명을 맞추고 싶어요!]

RaycastHit2D[] 배열로 만들어준 후 RaycastAll을 사용해주었고,

반복문을 이용하여 Debug해주었다.

 

Wall, Wall(1), Wall(2) 가 모두 검출되었다.

 

 

 

 

 

 

 

 

 

BoxCast, CapsuleCast, CircleCast 등을 사용한 후

파라미터 값을 조절해주면 Ray의 굵기도 조절해줄 수 있다.

 

 

 

 

 

 

 

[특정 오브젝트만들만 맞추고 싶어요!]

 

Object의 Inspector창에서 Add Layer로

각 Wall마다 Layer를 설정해주었다.

 

 

 

 

 

 

 

int형 변수 layerMask를 정의하고 GetMask로 LayerMask를 가져왔고, 그 값을 Physics2D.Raycast에 넣어주었다.

 

 

Wall Layer로 설정해준 오브젝트만 검출되는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

[응용하기]

아래 스크립트는 중복점프를 방지하는 OnJump를 구현하는 스크립트이다.

 

Script에서 LayerMask에 직접 접근하여

검출할 LayerMask를 설정할 수도 있다.

 

 

 

 

반응형