Unity의 InputSystem

Hyeon O·2025년 5월 16일

개요

Unity의 Input System은 기존의 Input.GetKey() 기반의 레거시 입력 처리 방식을 대체하며, 보다 유연하고 확장 가능한 입력 처리 시스템을 제공한다 특히 멀티 플랫폼, 멀티 컨트롤러(게임패드, 모바일, 키보드, 마우스 등) 대응에 강력한 구조를 가지고 있다.

어떤 개념인지 정리하고 사용하는 방법을 익혀보자.

Unity Input System이란?

Unity에서 키보드, 마우스, 게임패드, 터치, 모바일 센서 등 다양한 입력 장치를 통합적으로 처리하기 위해 도입된 모던 입력 프레임워크이다.

Input.GetKey() 같이

스크립트로 입력에 대한 처리를 했던 것과 달리

Unity 에디터 상에서 패키지를 설치하여 간편하고 통합적으로 관리할 수 있다.

InputSystem 사용하기

InputSystem을 사용하는 방법에 대해서 정리해보자.

1. 설치하기

Package ManagerInput System 검색 → 설치

2. InputAction 폴더 생성 후 Input Action 만들기

생성할 폴더 우클릭 → Create → Input Actions

생성한 Input Actions 더블클릭 → Action Map & Action 정의 UI 열림

3. 액션 설정하기

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에 따라 다른 설정이 있다.

액션을 추가하고, 액션 오른쪽 +를 클릭하면 다음과 같은 바인딩 종류가 나온다.

  • Add Binding : 단일 키나 버튼을 바인딩하는 기본적인 방식이다.
    • 예를 들어 space 키를 Jump 액션에 바인딩
  • Add Positive/Negative Binding : 하나의 액션에 대해 +방향과 -방향을 각각 키로 지정하는 방식
    • 대표적으로 동서남북 움직임을 바인딩
  • Add Binding With One Modifier : 어떤 키를 수정자로 지정하고 특정 키와 함께 눌렸을 때만 액션을 트리거 하는 방식이다
    • ctrl + e 키로 퀘스트 창을 여는 것 같은 부분에서 사용할 수 있다.
  • Add Binding With Two Modifiers : 두 개의 키를 동시에 누르고 다른 키를 눌러야 트리거 되는 복합 입력 방식이다.

🧐여기서는 Invoke Event 방식으로 다음 과정을 진행한다.

4. Input Action asset 오브젝트 컴포넌트로 할당(Invoke Event방식)

이렇게 액션과 액션에 대한 바인딩을 설정하고 나서

이 액션을 사용할 오브젝트의 컴포넌트로 할당한다.

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

behavior에서 입력에 대한 함수 호출 방식을 지정할 수 있다.

  • SendMessage : “On + Action name” 인 함수를 찾아서 호출하는 방식이다.
  • Invoke Event : Inspector 상에서 Action에 함수를 설정하고 키 입력이 들어 왔을 때 호출.
  • Invoke C sharp Events
    1. C# 스크립트에서 Invoke Event 과정을 수행.

    2. 키 입력 받고 실행 전, 키 입력 받고 실행 완료, 키 입력 해제 등의 구체적인 상황에 따라 별도의 함수를 등록할 수 있다.

      여기서는 Invoke Event 방식으로 다음 과정을 진행한다.

5. 스크립트에서 해당 액션 메소드 구현 및 호출

이렇게 만들어진 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

해당 입력 액션이 발생했을 때의 전체 상황 정보를 담은 구조체이다.

  • 어떤 장치에서 입력이 왔는지 확인 가능
  • 입력 값이 어떤 타입인지에 따라 제네릭으로 값 추출 가능
  • 입력 상태(phase), 장치 정보, 시간 정보, 바인딩 정보 등 포함

context.phase 는 입력이 발생했을 때의 단계를 의미한다.

입력은 단순히 “눌렸다”만 있는 게 아니라 여러 단계로 나뉘며, 이를 구분하면 더 정밀한 조작이 가능하다.

Phase 이름의미용도 예시
Started입력이 시작됨 (키를 누름 순간)누른 순간 효과, 예: 이펙트 시작
Performed입력이 유효하게 인식됨 (지속 또는 버튼 입력 완료)주된 행동 트리거
Canceled입력이 종료됨 (키를 뗌, 조이스틱 중립 등)입력 해제 처리

context.ReadValue<Vector2>() 는 입력 값을 읽어오는 메서드이다.

Vector2 타입은 Move 액션이 ControlType = Vector2 (WASD,)로 설정되었기 때문에 사용된다.

ReadValue<T>()context.phase == Performed일 때만 유효한 값 반환

즉 위 코드의 Onmove에서 상황에 대한 처리 결과를 정리하면 다음과 같다.

상황처리 결과
방향키 눌렀을 때PerformedcurMovementInput에 방향값 저장
방향키 떼었을 때CanceledcurMovementInput을 0으로 초기화
입력 중간Started 상태일 수 있으나 무시됨 (현재 조건에선 처리 안 함)
profile
천천히, 꾸준하게, 끝까지

0개의 댓글