Unity new Input system

2021년 12월 23일
제작기간 2021년 12월 23일
태그 Unity

Reference 👉👉 Quick Start

Reference 👉👉 Interaction

(세팅은 위의 Quick Start에 자세히 나와있다.)

Package Manager에서 Input system을 Install 하면 UnityEngine.InputSystem를 통해 새 Input system기능을 사용할 수 있다.

namespace를 찾을 수 없는 경우에는 Preference의 External Tools에서 .csproj를 Regerate 해주면 된다.

Input 처리

public void Move(InputAction.CallbackContext callback)
{
    _player.MoveDirection = callback.ReadValue<Vector2>();
}

InputAction.CallbackContext을 통해서 Input Value를 받아올 수 있다. 해당 값은 InputAction에서 지정한 형태로 Cast할 수 있다.

public void Attack(InputAction.CallbackContext callback)
{
    if (!callback.performed) return;
    Debug.Log("ATTACK");
}

Event는 총 세 가지의 behavior가 있다. started, performed, canceled가 있으며 성공적으로 input을 받은 경우에 performed action을 넘겨준다. 정상적으로 실행을 시작하고 완료했다면 started와 performed가 모두 넘어오기 때문에, 완전히 실행한 후에만 진행하고 싶으면 위와 같이 처리할 수 있다.

public void SomeAction(ActionState keyState)
{
    if (!IsValidAction()) return;

    switch (keyState)
    {
        case ActionState.Started:
            _isOnAction = true;
            break;

        case ActionState.Performed:
            CompleteAction(true);
            break;

        case ActionState.Canceled:
            if (!_isOnAction) return;
            CompleteAction(false);
            break;
    }
}

performed가 되었건 안 되었건 Button 입력이 취소되면 Canceled action이 넘어오는데 Hold 형태의 Interaction인 경우 처리가 번거로웠다. Hold 액션의 취소인지, 아니면 정상 동작 후의 입력 취소인지 구분하기 위해 keyState를 별도로 만들어서 관리하였다.

Action Map

_player_input.SwitchCurrentActionMap(actionMapName);

위와 같은 방식으로 액션 맵을 교체할 수 있다. 나는 Player와 UI를 분리하여 UI 패널 위에서는 UI 조작, 게임 모드에서는 게임 조작이 작동하게 하였다. 같은 조작이지만 상황에 따라 다른 행동을 해줘야할 때 사용하기 편하다.