5-1. 7조 플레이어 이동과 카메라 구현

keubung·2024년 11월 12일

플레이어 이동

체크리스트

  • 카메라는 플레이어의 오른쪽, 뒤쪽, 위쪽에 위치

  • 이동을 할 때 플레이어가 움직이는 방향으로 회전
    (임시로 Input.GetKeyDown 사용)

    1. 키를 눌렀을 때 해당 방향으로 유니티에서 2칸씩 이동하도록 구현
    private float moveAmount = 2f;
    
    void Update()
    {
        Move();
    }
    
    public void Move()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            transform.Translate(0, 0, moveAmount);
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            transform.Translate(-moveAmount, 0, 0);
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            transform.Translate(0, 0, -moveAmount);
        }
        else if (Input.GetKeyDown(KeyCode.D))
        {
            transform.Translate(moveAmount, 0, 0);
        }
    }
    1. 움직이는 방향으로 플레이어가 회전하도록 구현
    private float moveAmount = 2f;
    
    void Update()
    {
        Move();
    }
    
    public void Move()
    {
        // 회전 방향을 주고 그 방향으로 직진
        if (Input.GetKeyDown(KeyCode.W))
        {
            transform.rotation = Quaternion.Euler(0, 0, 0);
            transform.Translate(0, 0, moveAmount);
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            transform.rotation = Quaternion.Euler(0, -90, 0);
            transform.Translate(0, 0, moveAmount);
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            transform.rotation = Quaternion.Euler(0, 180, 0);
            transform.Translate(0, 0, moveAmount);
        }
        else if (Input.GetKeyDown(KeyCode.D))
        {
            transform.rotation = Quaternion.Euler(0, 90, 0);
            transform.Translate(0, 0, moveAmount);
        }
    }

-> 이렇게 했을 때 회전이 플레이어의 중심이 아니라 플레이어의 앞에 축을 두고 회전하는 느낌이 있었음.

  1. 함수를 따로 만들어 이동과 회전을 구현
private float moveAmount = 2f;
public float moveSpeed = 5f; // 이동 속도
public float rotationSpeed = 2f;
private bool isMoving = false;

void Update()
{
    Move();
}

public void Move()
{
    if (!isMoving)
    {
        // W 키가 눌렸을 때
        if (Input.GetKeyDown(KeyCode.W))
        {
            //transform.rotation = Quaternion.Euler(0, 0, 0);
            //transform.Translate(0, 0, moveAmount);
            StartCoroutine(MovePlayer(Vector3.forward, Quaternion.Euler(0, 0, 0)));
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            //transform.rotation = Quaternion.Euler(0, -90, 0);
            //transform.Translate(0, 0, moveAmount);
            StartCoroutine(MovePlayer(Vector3.left, Quaternion.Euler(0, -90, 0)));
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            //transform.rotation = Quaternion.Euler(0, 180, 0);
            //transform.Translate(0, 0, moveAmount);
            StartCoroutine(MovePlayer(Vector3.back, Quaternion.Euler(0, 180, 0)));
        }
        else if (Input.GetKeyDown(KeyCode.D))
        {
            //transform.rotation = Quaternion.Euler(0, 90, 0);
            //transform.Translate(0, 0, moveAmount);
            StartCoroutine(MovePlayer(Vector3.right, Quaternion.Euler(0, 90, 0)));
        }
    }
}

private IEnumerator MovePlayer(Vector3 direction, Quaternion targetRotation)
{
    isMoving = true;
    Vector3 startPosition = transform.position;
    Vector3 endPosition = startPosition + direction * moveAmount;
    Quaternion startRotation = transform.rotation;

    float elapsedTime = 0f;
    while (elapsedTime < 1f)
    {
        float lerpFactor = elapsedTime / 1f;
        transform.position = Vector3.Lerp(startPosition, endPosition, lerpFactor);
        transform.rotation = Quaternion.Slerp(startRotation, targetRotation, lerpFactor);
        elapsedTime += Time.deltaTime * moveSpeed;

        yield return null;
    }

    transform.position = endPosition;
    transform.rotation = targetRotation;
    isMoving = false;
}

+ Vector3.Lerp를 사용하여 이동을 시작지점에서 목표지점까지 자연스럽게 움직이도록 해줌
+ Quaternion.Slerp를 사용하여 회전이 부드럽게 움직이도록 해줌.

- 회전의 기준점을 잡아주기 위해 transform.RotateAround()를 사용하였으나 회전에 문제가 생겨서 사용하지 않음.
- 현재 회전하며 이동할 때 2칸씩이 아니라 1칸씩 움직이는 경우가 있음.

profile
김나영(Unity_6기)

0개의 댓글