Unity의 Input System은 기존의 Input.GetKey() 기반의 레거시 입력 처리 방식을 대체하며, 보다 유연하고 확장 가능한 입력 처리 시스템을 제공한다 특히 멀티 플랫폼, 멀티 컨트롤러(게임패드, 모바일, 키보드, 마우스 등) 대응에 강력한 구조를 가지고 있다.
어떤 개념인지 정리하고 사용하는 방법을 익혀보자.
Unity에서 키보드, 마우스, 게임패드, 터치, 모바일 센서 등 다양한 입력 장치를 통합적으로 처리하기 위해 도입된 모던 입력 프레임워크이다.
Input.GetKey() 같이
스크립트로 입력에 대한 처리를 했던 것과 달리
Unity 에디터 상에서 패키지를 설치하여 간편하고 통합적으로 관리할 수 있다.
InputSystem을 사용하는 방법에 대해서 정리해보자.
Package Manager → Input System 검색 → 설치
생성할 폴더 우클릭 → Create → Input Actions
생성한 Input Actions 더블클릭 → Action Map & Action 정의 UI 열림

Action Maps 는 액션 맵 목록으로
입력 상황별 그룹이다.
중간에 Actions는 해당 액션 맵에 포함된 각 액션 목록이다.
이 영역에 우클릭으로 액션을 추가할 수 있고
추가 시 바인딩이 없는 상태로 추가된다.

여기에 + 를 클릭하여 바인딩을 지정할 수 있다.
또한 오른쪽에 Action Properties 은 액션 속성으로
Action Type에는 Value, Button, PassThrough 중 선택하고
Value 선택 시 Control Type : 입력 장치의 타입 지정 (예: Vector2, Button, Axis, Quaternion 등) 을 설정한다.
Interactions은 이 액션에 대한 입력의 특수 행동 조건을 추가하는 것으로
다음과 같은 예시가 있다.
Hold: 누르고 있어야 입력됨Tap: 빠르게 눌렀을 때만 반응SlowTap: 천천히 누르고 떼야 반응Press and Release 등Processors는 입력 전처리기로 입력 값을 전처리하여 코드로 넘기는 용도이다.
Invert: 축 반전Scale: 값 크기 조절Normalize: 벡터 정규화Clamp: 범위 제한등등 있고 Action Type에 따라 다른 설정이 있다.
액션을 추가하고, 액션 오른쪽 +를 클릭하면 다음과 같은 바인딩 종류가 나온다.

🧐여기서는
Invoke Event방식으로 다음 과정을 진행한다.
Invoke Event방식)이렇게 액션과 액션에 대한 바인딩을 설정하고 나서
이 액션을 사용할 오브젝트의 컴포넌트로 할당한다.

할당 후 Inspector 창에서 연결해주면 된다.

behavior에서 입력에 대한 함수 호출 방식을 지정할 수 있다.
SendMessage : “On + Action name” 인 함수를 찾아서 호출하는 방식이다.Invoke Event : Inspector 상에서 Action에 함수를 설정하고 키 입력이 들어 왔을 때 호출.Invoke C sharp EventsC# 스크립트에서 Invoke Event 과정을 수행.
키 입력 받고 실행 전, 키 입력 받고 실행 완료, 키 입력 해제 등의 구체적인 상황에 따라 별도의 함수를 등록할 수 있다.
여기서는 Invoke Event 방식으로 다음 과정을 진행한다.
이렇게 만들어진 InputSystem을 통해
스크립트에서 Input.GetKey() 를 사용하지 않고
입력에 대한 처리를 구현할 수 있다.

플레이어 움직임에 대한 입력을 위와 같이 바인딩 해두었다고 가정하면
이제 움직임을 구현할 때 다음과 같이 코드를 작성하기만 하면 된다.
//Player움직임스크립트.cs
public float movSpeed;
private Vector2 curMovementInput;
//Unity Input System의 "Move" 액션과 연결된 입력 이벤트 핸들러
public void OnMove(InputAction.CallbackContext context)
{
if (context.phase == InputActionPhase.Performed)
{
curMovementInput = context.ReadValue<Vector2>();
}
else if (context.phase == InputActionPhase.Canceled)
{
curMovementInput = Vector2.zero;
}
}
//현재 입력값을 기준으로 이동 방향 벡터 계산 후 Rigidbody에 속도 적용
void Move()
{
Vector3 dir = transform.forward*curMovementInput.y+transform.right*curMovementInput.x;
dir *= movSpeed;
dir.y= rb.velocity.y;
rb.velocity = dir;
}
//물리 처리 프레임마다 Move() 호출하여 실제 이동 실행
private void FixedUpdate()
{
Move();
}
위 코드에서
OnMove(InputAction.CallbackContext context) 에서 전달되는 context는
해당 입력 액션이 발생했을 때의 전체 상황 정보를 담은 구조체이다.
context.phase 는 입력이 발생했을 때의 단계를 의미한다.
입력은 단순히 “눌렸다”만 있는 게 아니라 여러 단계로 나뉘며, 이를 구분하면 더 정밀한 조작이 가능하다.
| Phase 이름 | 의미 | 용도 예시 |
|---|---|---|
Started | 입력이 시작됨 (키를 누름 순간) | 누른 순간 효과, 예: 이펙트 시작 |
Performed | 입력이 유효하게 인식됨 (지속 또는 버튼 입력 완료) | 주된 행동 트리거 |
Canceled | 입력이 종료됨 (키를 뗌, 조이스틱 중립 등) | 입력 해제 처리 |
context.ReadValue<Vector2>() 는 입력 값을 읽어오는 메서드이다.
Vector2 타입은 Move 액션이 ControlType = Vector2 (WASD,)로 설정되었기 때문에 사용된다.
ReadValue<T>()는context.phase == Performed일 때만 유효한 값 반환
즉 위 코드의 Onmove에서 상황에 대한 처리 결과를 정리하면 다음과 같다.
| 상황 | 처리 결과 |
|---|---|
| 방향키 눌렀을 때 | Performed → curMovementInput에 방향값 저장 |
| 방향키 떼었을 때 | Canceled → curMovementInput을 0으로 초기화 |
| 입력 중간 | Started 상태일 수 있으나 무시됨 (현재 조건에선 처리 안 함) |