본문 바로가기

유니티

유니티 이론 01. GetAxis와 GetAxisRaw 차이점

유니티에는 Input Manager라는 키보드, 마우스, 조이스틱 등의 입력을 담당하는 기능이 있습니다. 이 Input Manager을 통해서 보다 간편하게 입력 데이터를 받아 올 수 있죠. 이전 강좌에서도(자세하게 설명드리지는 않았지만) Input Manager을 사용해서 플레이어의 이동을 구현했습니다. Input Manager에 등록된 데이터를 사용하기 위해서는 GetAxis 또는 GetAxisRaw 함수를 사용해야 하는데요, 이번 포스트에서는 이 두 함수의 차이에 대해서 알려드리도록 하겠습니다. 


 

유니티 강좌 02. 2D 플레이어 이동

지난 강좌에서 유니티의 기본 인터페이스에 대해서 배웠습니다. 그럼 이제 본격적으로 유니티를 사용해 봐야겠죠. 게임에서 가장 기본적인 요소 중 하나가 바로 플레이어입니다. 그중에서도 제

torotoblog.tistory.com

 

유니티 강좌 05. 2D 플랫포머 이동

저번에는 탑뷰 형식의 게임에 사용될 플레이어 상하좌우 이동에 대해서 알려드렸습니다. 하지만 마리오, 소닉, 테라리아 같은 플랫포머 게임을 만들 때는 중력이 적용된 좌우 이동이 필요합니

torotoblog.tistory.com


상단 메뉴에서 Edit > Project Settings로 들어가시면 여러 설정 메뉴 중 Input Manager가 있습니다. 저희가 사용해 본 Horizontal, Vertical부터 시작해서 여러 종류의 인풋들이 있는 걸 볼 수 있네요. GetAxis 또는 GetAxisRaw 함수를 사용하면 여기에 있는 인풋들을 불러오는 것이기 때문에 이름을 정확하게 적어주는 것이 매우 중요합니다. 대소문자 하나라도 틀리면 어떤 인풋을 의미하는지 유니티가 알지 못하기 때문이죠. 

그렇다면 GetAxis와 GetAxisRaw의 차이점은 무엇일까요? 둘 다 모두 같은 기능을 수행하는 것 같은데 말이죠. 한번 실험을 해보도록 하겠습니다. 

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed;
    private float moveInput;

    private Rigidbody2D rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        moveInput = Input.GetAxisRaw("Horizontal");
        Debug.Log(moveInput);
        rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
    }
}

간단하게 플레이어 좌우 이동을 구현해 봤습니다. 인풋은 지금까지 저희가 사용해왔던 GetAxisRaw() 함수를 사용했는데요, 인풋을 받은 후 Debug.Log() 함수를 통해서 moveInput 값이 어떻게 나오는지 확인해 보도록 하죠. Debug.Log() 함수는 원하는 데이터를 유니티의 Console 창에 프린트해 주는 함수입니다. 이걸 사용해서 간단하게 원하는 결과가 나오고 있는지 테스트할 수 있습니다. 게임을 실행하고 플레이어를 이동해 봅시다. 

Console 창을 보시면 moveInput 값들이 보입니다. 저는 좌우 모두 움직였기 때문에 -1, 0, 1 이렇게 세 가지 값이 나타납니다. 가만히 있을 때는 0, 오른쪽으로 움직일 때는 1, 왼쪽으로 움직일 때는 -1의 값이 나오죠. 

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed;
    private float moveInput;

    private Rigidbody2D rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        moveInput = Input.GetAxis("Horizontal");
        Debug.Log(moveInput);
        rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
    }
}

이번에는 코드를 조금 수정해 보겠습니다. GetAxisRaw()를 GetAxis()로 바꿨습니다. 나머지는 그대로 두고 다시 한번 테스트를 해봅시다. 게임을 실행하고 플레이어를 이동해 보도록 하죠. 

마찬가지로 Console 창을 보시면 이번에는 뭔가 많이 있는 것을 볼 수 있습니다. 플레이어를 이동하는 동안에도 느끼신 분들이 있었겠지만, 이번에는 0에서부터 -1 또는 1까지 서서히 올라가게 됩니다. 그래서 그 사이 값들이 Console에 찍힌 거죠. 사람이 실제로 달리다가 멈추게 되면 바로 속도 때문에 바로 멈추지 못하고 몇 발자국 더 나아가는 것과 비슷합니다. 이제 차이점이 좀 보이시나요? 하지만 이러한 차이가 있다고 해서, 이 차이를 어떻게 활용해야 하는 걸까요? 

이 두 함수는 플레이어가 이동하다 멈출 때 가장 크게 체감됩니다. 발로란트 같은 게임들을 보면 키보드에서 손을 뗀다고 바로 플레이어가 멈추지 않고 서서히 속도를 줄이다 멈추죠. 그렇다 보니 스톱 무빙이 게임에 영향을 미치는 요소 중 하나죠. 반면 키보드에서 손을 떼면 바로 멈춰버리는 게임들도 있습니다. 이렇듯 지금 내가 어떤 게임을 만들고 있는지, 게임에서 요구하는 요소가 어떤 것들이 있는지를 생각해 보고 그에 적절한 함수를 사용하는 것이 중요합니다.