Unity/게임 제작

[Unity] 3D 죽림고수 만들기(1) - 플레이어

정명직 2023. 7. 13. 23:15

이번에는 직접 게임을 만들어보면서 게임 개발의 기본적인 요소를 배우려고 합니다. 첫 번째로 플래시게임 죽림고수를 모작하여서 3D게임으로 만들어보겠습니다. 

 

죽림고수?

플레이어를 움직여 날아오는 화살을 피해 오래 버티는 것이 목적인 게임입니다.

죽림고수

이 게임을 3D로 구현해보겠습니다! 이번 글에서는 플레이어 조작을 만들어 보겠습니다. 

 

 

플레이어 이동 구현

죽림고수는 플레이어가 이동하면서 화살들을 피하기 때문에 저희는 앞뒤 좌우로 이동할 수 있게 플레이어 이동을 구현해보겠습니다

public class PlayerController : MonoBehaviour
{
    private float moveSpeed = 5;

    private void Update()
    {
        Move();
    }

    void Move()
    {
        // 방향키 입력 받기
        float hAxis = Input.GetAxisRaw("Horizontal");
        float vAxis = Input.GetAxisRaw("Vertical");
        
        // 이동 방향 구하기 
        Vector3 moveDir = new Vector3(hAxis, 0, vAxis).normalized;
        
        // 이동
        transform.Translate(moveDir.normalized * moveSpeed * Time.deltaTime);
    }
}

플레이이가 방향키를 입력했을 때 움직일 수 있게 간단한 로직을 작성해 주었습니다.

 

Player Inspector

플레이어 게임 오브젝트에 충돌을 처리할 CapsuleCollider와 Rigidbody를 추가하고 위에 작성한 PlayerController을 추가해 줍니다. 

 

플레이어 이동

위에 화면처럼 플레이어가 이동하는 모습을 볼 수 있습니다.

 

카메라

저는 게임을 좀 더 긴박하게 하기 위해서 플레이어 시점을 1인칭으로 구현하겠습니다. 1인칭을 구현하려면 마우스를 움직였을 때 카메라가 회전하고 플레이어를 따라 다녀야 합니다.

public class CamraRotate : MonoBehaviour
{
    [SerializeField] private GameObject player;  // 플레이어 게임오브젝트

    [SerializeField] private Transform cameraPos; // 플레이어 안에 있는 카메라 위치

    private float turnSpeed = 4.0f; // 마우스 회전 속도

    private float xRotate = 0.0f;   // 내부 사용할 X축 회전량은 별도 정의 ( 카메라 위 아래 방향 )

    // 카메라 이동은 LateUpdate에서
    private void LateUpdate()
    {
        transform.position = cameraPos.position;
    }

    private void Update()
    {
        // 좌우로 움직인 마우스의 이동량 * 속도에 따라 카메라가 좌우로 회전할 양 계산
        float yRotateSize = Input.GetAxis("Mouse X") * turnSpeed;
        // 현재 카메라가 바라보는 방향에 회전 방향 값을 더해준다
        float yRotate = transform.eulerAngles.y + yRotateSize;

        // 위아래로 움직인 마우스의 이동량 * 속도에 따라 카메라가 위아래로 회전할 양 계산
        float xRotateSize = -Input.GetAxis("Mouse Y") * turnSpeed;
        // 위 아래 볼 수 있는 각도를 제한 
        xRotate = Mathf.Clamp(xRotate + xRotateSize, -45, 80);

        // 카메라 회전량을 카메라에 반영
        transform.eulerAngles = new Vector3(xRotate, yRotate, 0);
        // 카메라 회전량을 플레이어 오브젝트에 반영 (Y 축만)
        player.transform.eulerAngles = new Vector3(0, yRotate, 0);
    }
}

카메라를 조작하는 로직을 작성하였습니다.

 

카메라 위치 오브젝트

실제로 카메라가 위치할 곳을 플레이어 자식 오브젝트로 생성합니다.  LateUpdate로 카메라 포지션을 오브젝트 포지션으로 대입해줘서 플레이어를 따라다니게 해주었습니다.

 

카메라 셋팅

카메라를 셋팅하고 게임을 실행 시켜보겠습니다.

 

게임화면

마우스가 움직였을 때 카메라가 회전하는 모습을 볼 수 있고, 위아래로 회전 할 수 있는 최대 각도가 설정되어있는 것도 볼 수 있습니다. 성공적으로 1인칭 카메라를 구현하였습니다.

 

 

이번 글에서는 플레이어를 움직이고 1인칭 카메라를 구현하였습니다. 다음에는 죽림고수에서 나오는 장애물인 화살을 구현하고 생성하는 시스템을 직접 만들어보겠습니다.