본문 바로가기
[Unity]

[Unity] Input System으로 입력 처리하기

by 김기승 2024. 6. 8.

유니티에서 마우스나 키보드 입력을 어떻게 처리하는가?

아마 Input 클래스의 GetKey(KeyCode key), GetMouseButton(int button)와 같은 함수를

Update문에서 계속 체크하는 방식을 가장 많이 사용할 것이다.

 

하지만, 이러한 방식은 타겟 플랫폼이 달라질 때마다,

코드를 수정해야한다는 단점이 있다.

 

유니티에서는 입력 처리를 최적화하고, 통합 관리할 수 있는

InputSystem 패키지를 제공한다.

 

사용 방법에 대해 간단히 알아보도록 하자.


패키지 설치

일단, Package Manager에서 Input System을 설치해주자.

 

Yes 버튼을 눌러 프로젝트를 다시 시작한다.


에셋 생성

Create/Input Actions를 클릭하여 Input Action Asset을 생성해준다.

 

에셋을 열어 "Action Maps"과 "Actions"를 등록해준다.

 

위 예시에서는 "Player" 조작을 관리할 Map을 만들고,

W 또는 Up Arrow를 눌렀을 때, "Move Forward" Action이 실행되도록 구성했다.


스크립트 작성

using UnityEngine;
using UnityEngine.InputSystem; // InputSystem 네임스페이스

public class InputActionExample : MonoBehaviour
{
    [Header("Asset")]
    public InputActionAsset actionAsset; // 생성한 Input Action Asset

    [Header("Action")]
    public InputActionReference moveForwardAction; // "Move Forward" Action

    //__________________________________________________________________________ Enable & Disable
    private void OnEnable()
    {
        actionAsset.Enable(); // Asset을 활성화해야 Action이 실행된다.

        moveForwardAction.action.performed += onMoveForwardPerformed;
        moveForwardAction.action.canceled += onMoveForwardCanceled;
    }
    private void OnDisable()
    {
        actionAsset.Disable(); // Asset을 비활성화하면 Action이 실행되지 않는다.

        moveForwardAction.action.performed -= onMoveForwardPerformed;
        moveForwardAction.action.canceled -= onMoveForwardCanceled;
    }

    //__________________________________________________________________________ Event
    private void onMoveForwardPerformed(InputAction.CallbackContext obj) // Action이 실행될 때
    {
        Debug.Log("Move Forward | Performed");
    }
    private void onMoveForwardCanceled(InputAction.CallbackContext obj) // Action이 종료될 때
    {
        Debug.Log("Move Forward | Canceled");
    }
}

 

우선, 생성한 Input Action Asset을 활성화해야 Action이 실행되므로,

InputActionAsset.Enable() 함수를 실행한다.

 

그리고, Action이 실행될 때(performed)의 이벤트와

종료될 때(canceled)의 이벤트를 각각 등록해준다.

 

public 변수들은 위와 같이 할당해주자.


결과

잘 작동하는 것을 볼 수 있다.

 

Input Action Asset을 고도화한 예시


+ 키 동시 입력

하나의 키가 아닌, 둘 이상의 키 입력도 처리할 수 있다.


+ Value 타입

Button 타입 뿐만 아니라 Value 타입을 지원한다.

※ Vector2, Vector3, Axis, Quaternion, Integer, Delta, Touch, ...

using UnityEngine;
using UnityEngine.InputSystem;

public class InputActionExample : MonoBehaviour
{
    [Header("Asset")]
    public InputActionAsset actionAsset;

    [Header("Action")]
    public InputActionReference vector2Action;

    private void OnEnable()
    {
        actionAsset.Enable();

        vector2Action.action.performed += onVector2Performed;
    }
    private void onVector2Performed(InputAction.CallbackContext obj)
    {
        Vector2 vec2 = obj.ReadValue<Vector2>();
        Debug.Log(vec2);
    }
}

최근에 데모 및 샘플 프로젝트들을 살펴보면,

InputSystem을 활용한 사례가 많다.

 

유니티에서도 강조하는 만큼, 앞으로의 프로젝트에 지속해서 활용할 듯 싶다.

댓글