FPS 게임에서 플레이어의 움직임과 조작을 생각해보자!
마우스 : 캐릭터 회전
키보드 : 캐릭터 이동, 점프
결론적으로 우리가 만들어야 할 것은 회전, 이동, 점프이다. 여기서 캐릭터를 회전하는 코드를 먼저 만들어보자!
1. 유니티에서 바닥, 플레이어 오브젝트 만들기
하이어라키 뷰 > 3D Object > Plane에서 바닥을 만들어준다.
하이어라키 뷰 > 3D Object > Capsule에서 플레이어를 만들어준다.
각각 인스펙터 창에서 컴포넌트를 조정하여 바닥을 지면에 넓게 깔고 그 위에 플레이어를 위치시켰다.
2. 마우스로 값 입력 받아서 플레이어 회전시키기
- 마우스가 움직이면
- 움직인 값만큼
- 플레이어를 회전시킨다.
위와같은 순서로 스크립트를 짜보겠다.
Project > Assets에 create C# script > CamRotate.cs 생성
CamRotate 더블클릭 후 스크립트를 짜주면 된다.
public class CamRotate : MonoBehaviour
{
// 회전 속도 변수
public float rotSpeed = 200f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// 마우스에 입력된 회전값 변수에 저장
float mouse_X = Input.GetAxis("Mouse X");
float mouse_Y = Input.GetAxis("Mouse Y");
// 회전 방향 설정
transform.eulerAngles = new Vector3(-my, mx, 0);
}
}
이 코드 보면 '어쩌라는거지' 싶은데, 스크립트를 통해서 하나씩 설명을 적어보면,,
- 마우스가 움직이면
- 움직인 값만큼
- 플레이어를 회전시킨다.
플레이어가 마우스를 움직이면 움직인 값만큼 회전을 시켜야한다. 그러면 플레이어가 얼만큼 마우스를 움직였는지 받아와야 하는데, 이건 Input 클래스를 사용해서 유니티로부터 값을 받아와야한다.
Unity에서 Edit > Project setting > Input manager 경로로 들어가면 Input 클래스에서 자주 사용하는 값들이 미리 설정되어있다. 우리는 여기서 Mouse X, Y를 사용한다.
float mx = Input.GetAxis("Mouse X");
위와같이 입력해주면 Mouse가 X축으로 움직인 값을 float형의 h 변수에 담아준다.
그리고 오브젝트를 회전시키는 명령어인 eulerAngles를 사용해서
transform.eulerAngles = new Vector3(-my, mx, 0);을 해주면 회전값이 들어간다.
그런데 Vector3 메서드의 매개변수는 x, y, z가 들어가야하는데 왜 x자리에 y축에 음수를 붙인 -my가 들어가냐면
이렇게 정리가 된다.
내 신념이 있는데 이해 안되면 외우기라서 처음에 코드 달달 외웠다가 계속 쓰다보니 이해됐다.
(아직 안끝남) 지금까지 방향을 설정했다. 왼쪽으로 얼만큼 오른쪽으로 얼만큼 회전할지 각만 쟀지 움직이진 않았다. 그래서 움직이는 로직을 짜준다.
public class CamRotate : MonoBehaviour
{
// 회전 속도 변수
public float rotSpeed = 200f;
...
void Update()
{
// 마우스에 입력된 회전값 변수에 저장
float mouse_X = Input.GetAxis("Mouse X");
float mouse_Y = Input.GetAxis("Mouse Y");
// 물체 회전 방향 설정
transform.eulerAngles = new Vector3(-my, mx, 0);
// 회전시키기
// r=r0+vt
transform.eulerAngles += dir * rotSpeed * Time.deltaTime;
}
}
회전 속도를 전역변수로 선언 후 update에서 r = r0 + vt공식을 이용해서 위와같이 로직을 짜준다.
3. 스크립트 확인하기
CamRotate.cs를 main camera에 드래그 앤 드롭해서 컴포넌트에 추가해준다.
유니티에서 플레이 버튼을 눌러주면 카메라가 상하좌우로 회전한다.
(뿌듯)
4. 상하값 고정해주기
사람의 시선은 좌우로 360도 돌아가지만 상하로는 90도 이상 시선을 이동시킬 수 없다. 그래서 카메라 설정에서 상하값을 90도로 제한해야한다.
값은 제한하려면 Mathf 클래스의 Clamp() 함수를 사용해주면 된다.
...
update () {
...
// x축 회전(상하) 값을 -90 ~ 90으로 제한하기
Vector rot = transform.eulerAngles;
rot.x = Mathf.Clamp(rot.x, -90, 90);
transform.eulerAngles = rot;
}
Clamp(값, 최소 범위, 최대 범위); 인데 자세히 알고싶다면 컨트롤 누르고 Clamp 눌러서 메서드 확인하기를 추천
그런데,, 플레이어가 고개를 못숙인다. 마우스를 아래로 이동시켜도 계속 위를 바라보는데 그 이유는
위와같다. 그래서 우리는 transform 컴포지트가 -n도를 90-n도로 변경하기 전에 미리 선수쳐서 각도를 조정해서 적용하면 된다.
public class CamRotate : MonoBehaviour
{
...
// 회전값 변수
float mx = 0f;
float my = 0f;
void Update()
{
// 마우스를 입력 받아서 물체를 회전
float mouse_X = Input.GetAxis("Mouse X");
float mouse_Y = Input.GetAxis("Mouse Y");
// 회전값 변수에 마우스 입력 값만큼 미리 누적
mx += mouse_X * rotSpeed * Time.deltaTime;
my += mouse_Y * rotSpeed * Time.deltaTime;
// 마우스 상하 이동 회전 변수(my)의 값을 -90도 ~ 90도 사이로 제한
my = Mathf.Clamp(my, -90f, 90f);
// 물체를 회전 방향으로 회전
transform.eulerAngles = new Vector3(-my, mx, 0);
}
}
전역변수로 회전값 변수를 미리 만들어서, 마우스에서 입력되는 회전값을 속도와 방향 그리고 시간을 계산하여 mx, my 변수에 각각 담아준다. 그리고 상하를 제한해주고 해당 방향으로 물체를 회전하도록 작성했다.
'동식이 취업시키기 작전 > UNITY로 FPS GAME 개발(FEAT. 1인칭 마리오파티)' 카테고리의 다른 글
[UNITY] 2. 캐릭터 회전 (0) | 2023.07.19 |
---|---|
어떤걸 만들것인가 (0) | 2023.07.18 |