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 조작, 게임 모드에서는 게임 조작이 작동하게 하였다. 같은 조작이지만 상황에 따라 다른 행동을 해줘야할 때 사용하기 편하다.