본문 바로가기
Game Engine/Unity

(Unity) Input System을 이용한 게임패드, 키보드 입력 감지

by MeisterTJ 2022. 8. 15.

Steam 게임들을 하다보면 게임패드의 버튼을 누르면 UI가 게임패드 용으로 바뀌고,

다시 키보드를 누르면 UI가 키보드 마우스 용으로 바뀌는 것을 볼 수 있다.

 

심지어 PS패드, XBOX패드를 각각 따로 감지하여 표시해주는 게임들도 많이 볼 수 있다.

 

Unity에서 기존에 사용하던 Input Manager는 동일한 Input 이름으로 키보드, 게임패드에 둘 다 맵핑이 가능하기 때문에,

입력에 대한 처리를 단순하게 할 수 있다는 장점이 있지만 감지된 Input이 키보드인지, 게임패드인지를 알 수 없다는 단점이 있었다.

 

 

새로운 입력 시스템 소개 | Unity Blog

이번 입력 시스템은 처음부터 사용 편의성, 플랫폼 간 일관성 및 유연성을 염두에 두고 만들었습니다. 향후 Unity 2020.1버전과 함께 릴리스될 예정이며 미리 사용해 보시고 의견을 공유해주시기

blog.unity.com

유니티는 기존의 Input Manager의 단점을 인지하고, 위와 같이 새로운 입력시스템인 Input System을 추가했다.

 

 

Quick start guide | Input System | 1.4.1

Quick start guide Note: For information on how to install the new Input System, see Installation. Getting input directly from an Input Device The quickest way to get started in script is to read the current state directly from Input Devices. For example, t

docs.unity3d.com

상세 영문 가이드는 위 사이트를 참고하자.

가이드에서 소개하는 Input System을 사용해서 입력을 받는 방식은 3가지가 있다.

 

  1. Input Device로부터 입력을 직접 받기
  2. Input Action을 통해서 입력을 간접으로 받기 (PlayerInput Component 사용)
  3. Input Action을 코드 및 JSON으로 직접 컨트롤해서 받기

 

이 중에 1번은 가이드에 나와있는 것과 같이 너무 단순한 방식이고, 비효율적이며, 예를 들 필요도 없어서 패스.

3번은 가이드보다 더 자세히 쓸 자신이 없고, 잘 쓰이지 않을 방식이라 패스.

가장 많이 쓰일 방식인 2번을 소개한다.


Input Action을 통해서 입력을 간접으로 받기 (PlayerInput Component 사용)

PackageManager -> Input System

Input System은 Package Manager에서 설치가 가능하다.

설치를 하면 Unity에서 새로운 Input System을 사용하기 위해서 재시작을 하라고 안내한다.

 

 

Player Input Component

설치하면 Player Input 컴포넌트를 추가할 수 있게 된다. 

일단 첫번째로 Action을 세팅해야 한다.

Create Actions를 클릭해서 Input Action Asset을 생성하자.

 

 

Actions

Move, Look, Fire가 Action이고, 그 하위에 있는 것들이 Action에 맵핑되는 입력들이다.

각 Action들은 Callback을 어떤 인자로 할 것인지를 세팅할 수 있다. 

 

 

Input Action Asset

기본적으로 세팅되어 있는 것들만 봐도 대충 이런식으로 돌아가는 구나를 알 수 있다.

Use in control scheme은 Action이 어떤 조작체계에서 사용되는가를 나타낸다. 

 

 

Control Scheme

Control scheme은 왼쪽 상단에서 추가 및 수정이 가능하다.

각 Control scheme (게임패드, 키보드마우스 등) 에서 사용할 키와 키가 눌렸을 경우 실행될 액션을 세팅하면 된다.

 

 

More Specific Gamepads

PS와 XBOX 패드를 구분하고 싶을 경우에는 Control scheme에 PS및 XBOX를 적절한 이름으로 추가하고,

각 입력의 Path에서 More Specific Gamepads에 있는 컨트롤러에 맞게 세팅해주면 된다.

 

 

Player Input의 Actions에 아까 만든 Input Action Asset을 세팅하고, 

Open Input Debugger를 눌러보자.

 

 

Input Debugger

현재 내 컴퓨터에는 듀얼쇼크와 Xbox 컨트롤러가 물려있는데, 이게 표시가 되고 있다.

그리고 각 컨트롤러의 키 바인딩과, 현재 상태를 보여주고 있다.

 

 

Behavior 설정

Player Input의 Behavior는 Action 이벤트를 어디로 넘겨줄 것인지 결정하는 것인데,

Invoke Unity Events로 설정한다면 Action 리스트가 아래에 뜨게 되고 이벤트를 여기서 바인딩을 할 수 있다.

이 방식보다는 Send Messages를 선택하여 스크립트로 처리하는 것이 훨씬 낫다.

 

using UniRx;
using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class FrPlayerController : MonoBehaviour
{
    private PlayerInput playerInput;

    void Awake()
    {
        playerInput = GetComponent<PlayerInput>();
    }

    void Start()
    {
        // UniRX Code
        playerInput.ObserveEveryValueChanged(x => x.currentControlScheme)
            .Subscribe(OnControlSchemeChanged);
    }

    public void OnControlSchemeChanged(string _controlScheme)
    {
        Debug.Log($"OnControlSchemeChanged : {_controlScheme}");
    }

    public void OnFire()
    {
        Debug.Log("OnFire");
    }

    public void OnMove(InputValue _value)
    {
        Vector2 move = _value.Get<Vector2>();
        Debug.Log($"OnMove : {move.x}, {move.y}");
    }
}

PlayerInput Component를 가지고 게임패드 <-> 키보드마우스 간의 전환 감지 및

기본 Move, Fire 이벤트를 처리하는 예제이다.

 

 

이벤트가 잘 발생하는 것을 확인.