본문 바로가기
[ Unity ]/- 유니티 실습

유니티 - [FPS게임, 카메라마우스회전, 캐릭터컨트롤]

by MRG 2021. 8. 8.
728x90
반응형

▣ 안녕하세요.

이번장에서는 간단하게 FPS 게임에서 플레이어를 움직이고 

카메라로 마우스를 움직이게 하는 코드를 만들어보겠습니다.

 

▣ 먼저 3D 프로젝트를 생성해주시고, 3D 오브젝트로 플레이어와 큐브를 배치해주세요.

 

▣ 그런 다음에 플레이어 오브젝트에 콜라이더를 삭제해주시고 

Character Controller를 추가해주세요. 

 

▣ 그리고 플레이어 오브젝트를 따라서 카메라가 같이 움직여야 하기 때문에 

메인 카메라를 플레이어 오브젝트에 넣어주세요.

 

▣ 그런 다음에 메인 카메라에 위치를 플레이어 오브젝트 머리에 옮겨서 

FPS처럼 보이게 위치를 변경합니다. 

 

▣ 그런 다음에 플레이어오브젝트에 PlayerManager스크립트를 추가해주시고, 

스크립트를 실행해주세요.

그런 다음에 먼저 플레이어컨트롤러를 컴포넌트로 지정합니다. 

 

▣ 그런 다음에 다시 에디터로 돌아와서 

Player오브젝트를 클릭하고 Transform에 포지션에 값을 변경해봅니다.

3D 경우 x,y,z 중에 어떻게 앞으로 전진하는지를 알아보기 위함입니다.

z값을 바꾸면 앞으로 가는 걸 확인할 수 있습니다. 

 

▣ 다시 스크립트로 돌아와서 Update() 함수에 

playerMove()라는 함수를 만들어주세요.

그리고 float moveX, moveZ 변수를 생성해서 각각 input.GetAxis() 함수로 값을 반환받습니다. 

Vector3 move = new Vector(moveX, 0, moveZ)로 x, z에 마우스로 입력받은 값을 대입해줍니다.

그리고 character에 접근해서 Move()함수에 벡터 값을 넣어주면 됩니다.

하지만 여기서 중요한건 그냥 벡터 값을 넣게 되면

로컬 좌표 나의 좌표 기준으로만 움직이게 됩니다. 

그렇게 되면 마우스가 방향을 바꾸더라도 그 방향으로 움직이지 않고 

내 기준에서만 움직이기 때문에 이상한 곳으로 움직이게 됩니다. 그렇기 때문에

transfom.TransformDirection() 함수를 사용합니다. 함수에 매개변수 안에 

아까 정의했던 move 값을 넣어주고 Time.deltaTime 과 10 속도를 곱해줍니다. 

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

 

 

728x90

 

▣ 플레이를 눌러서 확인을 해보겠습니다.

그럼 정상적으로 움직이는걸 확인할 수 있습니다. 

이번에는 마우스를 좌우로 움직이면 좌우로 카메라가 움직이게 해 보겠습니다. 

좌우는 우선 플레이어가 자체가 움직이게 만들어보겠습니다.

이건 FPS게임마다 다릅니다. 

보통 몸체가 얼굴이 따로 나뉜 상태에서는 카메라만 회전하면 되지만,

저희는 따로 몸체가 없기 때문에 플레이어 자체를 회전시켜

좌우로 방향을 바꾸게 해보겠습니다. 

 

▣ 전역변수로 float mouseX = 0; 을 정의해주시고

mouseX += Input.GetAxis("Mouse X") * 10을 하도록 하겠습니다.

GetAxis("Mouse X")는 마우스를 오른쪽 왼쪽을 하게 되면 -1, 0, 1 이렇게 반환해줍니다. 

그리고 마우스에 스피드로 10을 곱했습니다.

그런 다음에 회전값을 바꿔주면 됩니다.

저장을 하고 플레이를 해보겠습니다. 

 

▣ 그럼 이렇게 정장적으로 좌우로 움직이는 걸 확인할 수 있습니다. 

 

▣ 이번에는 카메라를 회전시켜 위아래를 마우스로 회전하게 해 보겠습니다. 

메인 카메라에 스크립트를 추가해주세요.

 

▣ 그리고 카메라가 위아래로 회전하기 위해선 Rotation에 x, y, z 값 중에 어떤 걸 조정해야 하는지 확인하도록 하겠습니다.

값을 조정해보면 x, y 값중에 어떤 걸 해야 하는지 알게 되실 겁니다. 

 

▣ 그리고 스크립트를 들어와서 마우스에 스피드와 마우스y값을 저장하는 변수를 선언 및 정의를 하겠습니다. 

그리고 mouseY += 에 GetAxis("Mouse Y") * mouseSpeed를 더해주겠습니다.

더해주는 이유는 대입을 하게 되면 곱하기한 값으로 + 가 되서 고정되게 됩니다.

그렇기 때문에 +=를 해서 값에다 더 큰 값을 더하게 해주면 회전하게 됩니다.

그리고 -mouseY로 해야 반전으로 위아래를 할때 정상적으로 작동하게 됩니다. 

그리고 저장을 하고 실행을 하면 회전이 잘 되는걸 확인할 수 있습니다.

 

▣ 하지만 여기서 문제가 있습니다. 360도 이상으로 돌아가기 때문에 좀 이상합니다.

 

▣ 그럴때는 Mathf.Clamp() 함수로 값을 제한하게 할 수 있습니다.

 

▣ mouseY 값을 Mathf.Clamp(고정변수, 최솟값, 최댓값) 이렇게 대입을 해주면

고정된 값으로 제한을 하게 할 수 있습니다.

저장을 하고 

 

▣ 플레이를 해보면 이렇게 위아래가 고정되는걸 확인할 수 있습니다. 

 

▣ 이제 본인이 원하는 FPS게임을 만들어보세요. 

중요한 건 내가 플레이어가 회전할지 카메라가 회전할지를 꼭 생각을 하고 진행해주세요.

728x90
반응형

댓글