TIL_2025_03_04 InputSystem

김효중·2025년 3월 4일

InputSystem

InputSystem은 플레이어의 입력을 정의할 수 있다.
기존의 키보드, 마우스뿐만이 아닌 다양한 기기의 입력장치를 사용하여 제어할 수 있게한다.

사용자는 장치를 통해 입력을 제공하며 이러한 입력은 서로 다른 기기의 입력일지라도 InputSystem로 같은 코드를 실행 할 수 있게한다.

구성요소

InputSystem은 Input Action Asset을 사용하여 입력을 정의하고 통합한다.

Action Map

현재의 Action의 목록이며 각 맵은 그룹으로 지정되며 함께 활성/비활성화 될 수 있다.

Action

Action은 가장 중요한 개념으로 입력을 통합한다.
예를 들어 캐릭터를 움직이는 방법이 키보드와 패드의 움직임을 같은 입력으로 묶는다.
이를 통해 다양한 기기의 입력은 하나의 같은 입력으로 처리할 수 있는데 이를 binding이라한다.
binding을 통해 입력을 정의하고 묶을 수 있다.

Properties

각 입력의 속성으로 Action 또는 binding의 속성을 알 수 있다.

Action Type

이때 각각의 입력 유형을 설정할 수 있다.
하나의 Action은 Button, Value, PassTrough중에서 하나의 설정을 가진다
Button은 키보드, 마우스, 게임 패드와 같은 장치의 버튼입력에서 사용하며 변경시마다 Action을 호출한다. 누른 순간, 뗀 순간에 호출 된다. 이 상태는 performed, canceled 값으로 정의 된다.

if (context.phase == InputActionPhase.Started)
{

}

위와 같이 상태를 검사하는 코드에 사용할 수 있다.
즉 간단한 ON / OFF 동작에 사용할 수 있다.

Value는 마우스 이동, 조이스틱, 게임 패드 또는 일정기간동안 지속적으로 변경되는 입력에서 사용한다. 해당 유형에서는 값이 변경 될 때마다 트리거 되는 콜백을 통해 Action을 구동한다.

public void OnLook(InputAction.CallbackContext context)
{
    mouseDelta = context.ReadValue<Vector2>();
}

위와 같이 항상 값을 받아오는 코드에 사용할 수 있다.
즉 연속적인 값을 받는 상황에서 사용한다.
PassTrough는 Value형싱으로 같은 상황에서 사용 가능하나 특정 컨트롤에 상관없이 변동시 호출 된다.
이때 데이터가 필터링 없이 전달되며 현재의 값과 상태를 모두 전달한다.

public void OnSwipe(InputAction.CallbackContext context)
{
    Vector2 swipeInput = context.ReadValue<Vector2>();

    if (context.phase == InputActionPhase.Performed)
    {
        
    }
}

위와 같이 누른 값과 눌리거나 뗀 상태를 모두 받아 사용할 수 있다.
이는 모바일의 멀티 터치나 마우스를 길게 누른다는등의 복합적인 입력에 사용가능하다.

Control Type

Control Type은 작업에서 예상되는 컨트롤 유형을 선택할 수 있다.
이를 통해 입력 값의 형식을 제한할 수 있다.
예를 들어 이동의 경우 Vector2을 제공하도록하여 방향을 얻을 수 있다.

Binding

각 Action에 대해서는 Binding의 Path를 통해 연결할 입력을 정의할 수 있다.
이때 여러 기기의 입력을 같은 Action에 연결 할 수 있다.

player Input - Behavior


위에서 설정한 입력을 어떻게 전달할지 설정할 수 있다.

  • Send Messages
    "On + Action이름"의 형식의 함수를 직접 호출하며 Action Type에 따라 매개 변수가 다르다.
    Value로 설정했다면 InputValue타입으로, Button으로 설정하면 매개변수 없이 호출 된다.
  • Broadcast Messages
    위 경우 Messages와 같이 동작하지만 더 광범위하게 전달 된다.
    Send Messages는 해당 오브젝트에만 전달되어 함수를 호출하지만 Broadcast Messages는 자신과 자식 오브젝트에 대해서도 호출한다.
  • Invoke Unity Events

    위와 같이 이벤트를 직접 연결하여 조건 만족시 호출 될 함수를 연결할 수 있다.
    이 경우 매개변수는 InputAction.CallbackContext 타입으로 전달 된다.
  • Invoke C sharp Events
    위 경우 C#의 event와 delegate를 활용하여 직접 메서드를 바인딩한다.
	private PlayerInput playerInput;

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

        // C# 이벤트에 직접 핸들러 추가
        playerInput.actions["Move"].performed += OnMove;
        playerInput.actions["Move"].canceled += OnMoveCanceled;
    }

참고 : https://docs.unity3d.com/Packages/com.unity.inputsystem@1.12/manual/index.html

profile
도전하는 개발자

0개의 댓글