Unity/기초 예제

유니티 Raycast를 이용한 간단한 게임 만들기 Part 2 Player 간단한 예제 유니티 기초

최애뎡 2021. 6. 9. 20:24
728x90
반응형

Player 오브젝트의 z 값을 -5로 한 뒤 자식으로
Capsule 2개와 Cube 1개를 생성해줍니다.

 

 

각 오브젝트의 Transform을 변경하고

Capsule(1)과 Cube에 Wall에 적용했던 Material을 적용하면 요로코롬 귀여운 Player가 탄생합니다.
(이 Player 형상은 Unity Multy에 관한 내용을 찾아보다
유튜브에서 어느 한 분이 쓰셨던 건데 너무 귀여워서 저도 만들어.. 보았습니..다.....)
이제 Player을 움직여 볼까요?~

Player을 움직이기 위해 04. Scripts에 C# Script를 PlayerController라고 생성합니다. 

전 예제(Translate and Rotate)를 참조하여 간단히 움직일 수 있도록 합시다.

작성한 스크립트를 Player에 적용시켜주면

이렇게 Player가 움직이는 모습을 확인하실 수 있습니다.
이제 총알을 만들어 보겠습니다.

일단 Capsule(1)을 Gun으로 해주고 3D Object인 Sphere을 만들어주고 이름을 bullet으로 합니다.
전체 Scale을 0.2로 줄여 총알처럼 작게 만들어줍니다.
bullet에 Rigidbody를 적용시켜주고 Use Gravity를 해제하여 중력을 없애줍니다.
(기본 흰색의 경우 잘 보이지가 않아 새롭게 붉은 Material을 적용시켰습니다.)
bullet이 발사되어 다른 오브젝트에 충돌하였을 때 오브젝트를 없애기 위해
bullet이라는 스크립트를 만듭니다.

OnCollisionEnter을 이용하여 충돌 체크를 하고
충돌한 오브젝트의 Tag가 Box일 경우
Destroy를 이용하여 충돌한 물체를 없애고 bullet 또한 없애줍니다.

작성한 스크립트를 bullet에 적용시킨 뒤

Prefab 화하기 위해 bullet을 Project 폴더에 있는 03. prefabs에 옮기고
Hierarchy에 있는 bullet은 제거합니다.
Player도 움직이고 bullet도 만들었겠다 이제 총만 쏠 수 있으면 됩니다!!!
여기서부터 드디어 Raycast가 사용이 됩니다.

Player 안에 bulletSpawn, RayVector이라는 빈 오브젝트를 생성합니다.
bulletSpawn은 bullet이 생성될 위치이기도 하며 Ray가 나가는 시작점이기도 합니다.
RayVector의 경우 Ray의 2번째 매개변수를 위해 사용될 겁니다.

일단 bulletSpawn의 위치를 조절해줍니다.
(여기서  bullet prefab을 가져와 bulletSpawn의 자식으로 두고 위치를 조절하시면
보다 편하게 작업하실 수 있습니다.)

다음으로 RayVector의 위치를 조절해줍니다.
여기서 RayVector의 위치는 bulletSpawn의 위치에서 Ray가 나아갈 방향의 위치값만 증가시켜주시면 됩니다. 여기서는 z 방향으로 나아가야 하기 때문에 z의 값을 10으로 두었고 굳이 10으로 둔 이유는
후에 Debug.DrawLine()을 이용하여 Ray의 방향을 좀 더 편하게 확인하기 위함입니다.
이제 Gun 오브젝트를 사용하기 위해 Gun이라는 이름으로 스크립트를 제작하여줍니다.

이번 예제에서 가장 핵심적인 코딩 부분입니다.
일단 만든 bullet prefab을 사용하기 위해 7번 줄처럼 코딩하였습니다.
9, 10번 줄의 경우 Raycast에서 Ray의 첫 위치와 방향을 표현하기 위해 위에 만들었던
bulletSpawn, RayVector의 값을 가져오기 위해 Transform 형식의 변수를 만들었습니다.
Update()를 보기 전에 void fire() 함수를 보도록 하겠습니다.
앞서 공부했던 Instantiate를 이용하여 bullet을 bulletSpawn의 위치에 생성하고
velocity를 이용해 bullet에 속도를 주어 총알이 나가게 되는 함수입니다.
이제 Update()를 보겠습니다.
Raycast는 앞서 공부하였듯 광선 경로에 충돌체가 있는지 감지하기 위해 특정 방향의 점에서 보이지 않는 광선을 발사하는 과정 때문에 Game 뷰 상에서는 Ray의 방향을 확인할 수가 없습니다.
그러나 16째 줄에 Debug.DrawLine()를 활용하면 Game 뷰가 아닌 Scene 뷰에서
Ray가 어떻게 나오는지 대략 적으로 확인하실 수가 있습니다.
(Debug.DrawLine()은 말 그대로 선을 그려주는 것일 뿐 Ray를 만들어 주는 것이 아니기 때문에 Debug.DrawLine()을 통해 만들어진 선이 잘 나가는데 그 방향이 맞지 않게 되었다면 그것은 Raycast에서 
Ray의 방향을 잘못 주었거나 Debug.DrawLine()에서 선을 잘못 그렸기 때문입니다. 이것은 Ray를 좀 더 편하게 확인하기 위해 사용할 뿐 너무 확신을 가지고 신뢰를 할 수는 없습니다.!!!!!) 
16째 줄을 해석하면 
bulletSpawn의 위치부터 RayVector까지 red 색으로 선을 그려라입니다.
그리고 18째 줄에서 Raycast를 사용하게 됩니다.
Raycast의 두 번째 매개변수를 보면 왜 Debug.DrawLine() 때처럼 RayVector.position이 아닌
(RayVector.position - bulletSpawn.position).normalized의 값을 넣었는지 궁금하실 수가 있습니다. 이유는
DrawLine과 Raycast의 매개변수를 보시면
DrawLine(Vector3 start, Vector3 end, Color color)
Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo)
이렇게
Debug.DrawLine 은 시작점과 끝점을 인자로 받지만
Physics.Raycast는 시작점과 방향을 인자로 받기 때문입니다.
그렇기에
(RayVector.position - bulletSpawn.position).normalized의 방향 값을 넣어줍니다.
(RayVector.position - bulletSpawn.position를 통해
bulletSpawn.position에서 RayVector.position로 향하는 Vector를 만들어주고
.normalized을 통해 정규화 하여 방향만 가지는 Vector로 만들어 주는 것입니다.)
그리고 20 번째의 if 문을 통하여 Ray가 감지한 충돌체의 Tag가 Box인 오브젝트이고
 스페이스 바를 눌렀을 때 총알을 발사할 수 있게 해줍니다.
이제 Gun 스크립트를 Gun 오브젝트에 적용시킨 뒤

요로코롬 적용시켜주시면!
bullet도 나가고 Player도 잘 움직이겠죠?

Scene 뷰

위처럼 Scene 뷰에 Debug.DrawLine을 통해 대략적인 Ray의 방향을 알 수 있으며
Ray가 Tag가 Box인 오브젝트를 감지할 때 스페이스바를 눌러 총이 나가게 구현할 수 있습니다.
(스크립트상에서 총이 나가는 함수는 Ray가 Tag가 Box인 오브젝트를 감지하고 스페이스바를 눌렀을 때 총이 나가는 함수를 실행하도록 하였기 때문에 Ray가 앞서 만들었던 Box를 제외한 나머지 부분을 향할 때 스페이스바를 누르면 총이 나가지 않는 게 정상입니다.)

이제 마지막으로

위 실행 화면처럼 GameView에서도 Ray를 보이게 하면 되겠군요!
이것은 LineRenderer을 이용하면 되는데 다음 포스팅에서 소개하도록 하겠습니다.

반응형