[Unity/3D] 플레이어 이동 구현

s0lb1n·2023년 12월 18일

Unity/3D

목록 보기
1/2
post-thumbnail

플레이어의 움직임은 모든 게임의 핵심이다.
플레이어가 얼마나 자연스럽게 움직이느냐의 따라 게임의 몰입도가 달라지며, 플레이어 상호 작용의 핵심 역할로 게임 경험의 리듬과 흐름을 결정한다.


실습 준비

플레이어

에셋 다운
https://assetstore.unity.com/packages/3d/characters/robots/robot-soldier-142438

바닥

Box Collider 추가

Rigidbody, Collider 컴포넌트 추가

Rigidbody는 오브젝트가 물리 제어로 동작하게 한다. 오브젝트가 가상공간 내에서 사실적으로 움직이도록 해주는 역할을 한다.

Collider는 물리 충돌 처리를 위한 오브젝트의 형태를 정의한다. 아래와 같이 값을 넣어 위치를 조정한다. isTrigger는 체크시 충돌시 충돌을 감지하지만, 물리적 충돌이 발생하지 않으므로 체크 해지한다.

PlayerMovement 코드 작성

public float moveSpeed = 5f; // 이동 속도
public float turnSpeed = 5f; // 회전 속도

Rigidbody m_Rigidbody; //  객체에 연결된 Rigidbody 구성 요소에 대한 참조
Vector3 m_Movement; // 정규화된 움직임 입력을 저장하는 벡터

void Start()
{
    m_Animator = GetComponent<Animator>();
    m_Rigidbody = GetComponent<Rigidbody>();
}
m_이 붙은 변수는 유니티 인스펙터창에서 자동 컬링되어 표시된다.

키 입력(Input.GetAxis)


Input.GetAxis()는 GetAixs와 관련된 입력을 받아들여오는 명령어로, -1과 1 사이의 실수값을 리턴하고 기본적으로 0의 값을 가진 함수이다. 대표적으로 Horizontal과 Vertical에 대한 값을 받아올 수 있다.

  • Horizontal : 수평으로(좌/우) 움직이는 값을 받아온다.
  • Vertical : 수직으로(상/하) 움직이는 값을 받아온다.
float horizontal = Input.GetAxis("Horizontal"); // 수평 입력
float vertical = Input.GetAxis("Vertical"); // 수직 입력

벡터 정규화(normalized)

오브젝트의 균일한 이동을 위하여 벡터의 정규화가 필요하다. 정규화를 통해 모든 방향 벡터의 길이를 1로 맞춰주어 방향에 따른 이동 속도가 동일해진다.

m_Movement = new Vector3(horizontal, 0, vertical).normalized; //정규화

이동(move)

transform.position += m_Movement * moveSpeed * Time.deltaTime;

회전(rotate)

if (m_Movement != Vector3.zero) // 키 입력값이 존재할 때
{
    Quaternion toRotation = Quaternion.LookRotation(m_Movement, Vector3.up); // 해당 방향을 바라봄
    transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, turnSpeed * Time.deltaTime); // 부드러운 회전
}

결과

애니메이션 추가

자연스러운 움직임을 위해 애니메이션 추가
Idle > Run : true
Run > Idle : false

Animator m_Animator; //  객체에 연결된 Animator 구성 요소에 대한 참조
...
m_Animator = GetComponent<Animator>();
...
m_Animator.SetBool("isRunning", m_Movement != Vector3.zero); // 키 입력값이 존재할 때, isRunning true

📌전체 코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float turnSpeed = 5f;

    Animator m_Animator;
    Rigidbody m_Rigidbody;
    Vector3 m_Movement;

    void Start()
    {
        m_Animator = GetComponent<Animator>();
        m_Rigidbody = GetComponent<Rigidbody>();
    }
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        m_Movement = new Vector3(horizontal, 0, vertical).normalized;

        // 애니메이션 
        m_Animator.SetBool("isRunning", m_Movement != Vector3.zero);

        // 이동
        transform.position += m_Movement * moveSpeed * Time.deltaTime;

        // 회전
        if (m_Movement != Vector3.zero)
        {
            Quaternion toRotation = Quaternion.LookRotation(m_Movement, Vector3.up);
            transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, turnSpeed * Time.deltaTime);
        }
    }
}
profile
공부하고 또 공부하는📚

0개의 댓글