본문 바로가기
[ CODING STUDY ]/》유니티 실습

유니티 - [RayCast, RayCastAll, 레이캐스트]

by MRG 2021. 7. 26.
728x90
반응형

▣ 안녕하세요 이번장에서는 RayCast를 공부해보겠습니다.

레이 캐스트는 쉽게 이야기해서 오브젝트에서 레이저를 쏴서 그 레이저에 달인 오브젝트를

감지하기 위한 기능입니다. 보통 FPS 게임에서나 VR에서 많이 사용됩니다. 

 

▣ 먼저 간단하게 3D프로젝트를 생성해주시고, 3D 오브젝트에서 캡슐로 Player 만들어주세요.

Player안에 PlayerManager라는 스크립트도 작성해주세요.

 

▣ 그리고 레이 캐스트로 닿을 대상 3D 오브젝트에서 큐브를 생성해주세요.

위치에 Z값은 10으로 해주세요. 그리고 콜라이더도 꼭 추가해주세요. 충돌을 측정하기 위함입니다. 

이제 PlayerManager스크립트를 들어가서 코드를 작성해보겠습니다.

 

▣ Update() 함수에서 Physics. 를 접근해서 Raycast라고 작성을 하면 이렇게 

매개변수에 무엇을 넣어야 하는지 확인할 수 있습니다. 

이제 처음부터 하나하나 작성해보겠습니다.

 

▣ 먼저 RaycastHit hit; 레이 캐스트에 닿게 되면 그 값을 저장할 변수를 먼저 선언합니다. 

그리고 업데이트 함수에서 Physics.Raycast() 함수를 작성해주시는데

우리가 위에서 확인했던 것처럼 

Raycast(발사위치, 발사 방향, hit, 발사거리)를 매개변수로 하나하나 작성해주시면 됩니다. 

gameObject.transform.forward는 현재 오브젝트에서 정면인 z를 생각하시면 됩니다. 

그렇게 if() 안에 레이 캐스트 함수를 넣으면 레이 캐스트에 닿으면 if 조건이 참이기 때문에

안에 코드들이 실행하게 됩니다. 

 

▣ 그럼 Debug.Log() 함수로 hit.collider.name 히트 달인 오브젝트에 이름을 출력하고

Debug.DrawRay() 함수는 레이 캐스트가 우리 눈이 안보이기 때문에 그려주신다고 생각하시면 됩니다. 

DrawRay(발사위치, 발사할 방향과 거리, 발사 색)을 매개변수로 넣어주시면 됩니다. 

game.transfom.forward * hit.distance 방향과 거리를 함께 입력하신다고 생각하시면 되고 

Color.red 색은 이렇게 접근해서 원하는 색으로 클래스 값은 주거나 

직접 RGB 값을 입력해서 넣어도 됩니다. 

그리고 저장을 합니다.

▣ 그리고 다시 에디터로 돌아와 시작을 해보면 큐브가 닿을 때 

레이 캐스트 레이저가 보이고 콘솔 창에 Cube가 출력되는 걸 확인할 수 있습니다. 

 

▣ 또 하나에 오브젝트를 만들어보겠습니다. 

이번에는 다른 모양으로 캡슐을 생성해서 실행을 해보겠습니다.

캡슐에 위치는 조금 다르게 해 주세요.

 

 

▣ 그럼 캡슐과 큐브 모두가 레이 캐스트에 충돌되고 출력이 잘 되는 걸 확인할 수 있습니다.

이제 의문이 생깁니다. 

모든 걸 동일하게 측정하면 레이 캐스트를 쓰는 이유가 없겠죠.

게임에서도 다른 아이템과 다른 적들 배경들이 있을 수 있기 때문에

조건에 따라 다르게 반응하게 만들어야 합니다. 

그럴 때에는 이렇게 조건문을 만들어 진행할 수 도 있습니다. 

 

▣ hit.collider.name == "Cube" hit에 쌓인 게임 오브젝트에 이름이 Cube라면 작동하게 했습니다.

저장을 하고 실행을 해보겠습니다. 

 

▣ 그럼 캡슐에 닿으면 레이 캐스트 레이저 줄과 콘솔에 출력이 안되는 걸 확인할 수 있습니다. 

 

▣ 그럼 만약에 캡슐을 이렇게 한 라인에 두었을 경우 레이 캐스트가 이미 캡슐에 닿여 

뒤에 있는 큐브를 측정하지 못하게 됩니다. 

그럼 우리가 FPS를 만들 때에는 한 가지 아이템, 한가지 적만 레이 캐스트로 측정할 수 있게 됩니다.

이럴 때는 다른 레이 캐스트를 사용해야 합니다. 

 

▣ 여러 개에 hit를 입력받으려면 배열을 사용해야 합니다.

RaycastHit []로 선언을 해주시고 

RaycastAll을 사용해야 합니다. 여기에는 out hit를 매개변수로 넣지 않고 

raycasthit = 배열에 대입을 합니다.

그리고 for문을 이용하여 배열에 있는 값들을 하나하나 

지역변수 Raycast hit에 넣어주고 

조건문으로 검사하여 작성하면 됩니다. 

저장을 하고 확인을 해보면 

 

▣ 이렇게 관통해서 레이 캐스트 거리에 쌓인 모든 오브젝트를 검사할 수 있습니다.

그런데 여기서 또 생각을 해볼 문제는 모든 레이 캐스트를 검사한다면 

엄청난 프레임 드롭 프로그램이 연산을 많이 해서 무리가 가게 됩니다. 

이럴 때는 개발자가 선택을 해야 합니다.

만약 내가 원하는 게임 오브젝트에 닿을 경우 레이 캐스트를 끝내라는 코드 말이죠 

다시 스크립트로 돌아가겠습니다.

 

 

▣ 이렇게 캡슐에 닿을 경우 원하는 코드를 실행하고 마지막에 return; 을 넣습니다.

그리고 저장을 하겠습니다.

 

▣ 실행을 해서 확인을 해보면 이렇게 캡슐에 닿을 경우 레이 캐스트 올이 끝나는 걸 확인할 수 있습니다.

728x90
반응형

댓글