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

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

InputSystem은 Input Action Asset을 사용하여 입력을 정의하고 통합한다.
현재의 Action의 목록이며 각 맵은 그룹으로 지정되며 함께 활성/비활성화 될 수 있다.
Action은 가장 중요한 개념으로 입력을 통합한다.
예를 들어 캐릭터를 움직이는 방법이 키보드와 패드의 움직임을 같은 입력으로 묶는다.
이를 통해 다양한 기기의 입력은 하나의 같은 입력으로 처리할 수 있는데 이를 binding이라한다.
binding을 통해 입력을 정의하고 묶을 수 있다.
각 입력의 속성으로 Action 또는 binding의 속성을 알 수 있다.
이때 각각의 입력 유형을 설정할 수 있다.
하나의 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은 작업에서 예상되는 컨트롤 유형을 선택할 수 있다.
이를 통해 입력 값의 형식을 제한할 수 있다.
예를 들어 이동의 경우 Vector2을 제공하도록하여 방향을 얻을 수 있다.

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

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

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