
유니티 입력 시스템
Unity는 구버전(InputManager)과 신버전(InputSystem Package)의 두 가지 입력 시스템이 있습니다.
InputManager (구버전)
먼저 구버전은 [Edit > Project Settings > Input Manager] 에서 확인하실 수 있으며,
'W', 'LeftShift', 스페이스바 등의 물리적 키보드의 키, 전용 게임패드 리모컨의 버튼,
그리고 스크립트에서 [-1 or 1]의 값을 반환해 코딩할 수 있는 Virtual Axis.
Input.GetKey(KeyCode.W);
float horizontalInput = Input.GetAxis("Horizontal");
위 같은 행동들을 정의하여 InputManager라 할 수 있습니다.
InputSystem (신버전)
Unity6를 사용하시게 된다면, 에디터와 함께 자동적으로 설치돼 있을 겁니다.
혹시 확인이 필요하시다면, [Package Manager > Input System] 을 통해 확인하실 수 있습니다.
(로드할 때 Unity 에디터를 재시작해야 한다고 떠요!)
세팅하기

Input System 패키지가 잘 설치돼 있는지 확인하기 위해,
[Project Settings > Player > Other Settings] 에서 Configuration 의 Active Input Handling 을 확인해 주세요!

Project 탭에서 Create > Input Actions 를 클릭하게 되면,

이렇게 에셋 모듈이 하나 생성됩니다.
클릭하면 Inspector 탭에 아래와 같이 나타나게 되는데요,

Edit Asset을 눌러 Input Actions Editor 탭을 열어줍니다.


Control Scheme을 눌러 어떤 입력장치로 제어할지 선택해줍니다.
(저는 Scheme 이름을 플랫폼PC로 지은 다음, 사용할 Device에 키보드와 마우스를 추가했어요.)

혹은 아래처럼 게임패드를 추가하여 설정할 수도 있습니다.

그 다음, Input Actions를 추가해주면 아래와 같이 Properties 레이어에 항목들이 나타납니다.
Action Properties

Action Input을 추가해 해당 Action의 속성 값을 편집할 수 있습니다.

여기서 Action Type 에는 3가지 종류가 있으며, 설명은 아래와 같습니다.

| Value | Start : default 값에서 움직였을 때 performed : 계속해서 값이 변하고 있을 때 Canceled : 값이 다시 default 값으로 돌아왔을 때 |
| Button | 버튼을 한번 눌렀을 때 액션이 Trigger, 단일성으로 눌렀다 떼는 이벤트 (Interactions 항목에서 Threshold 값을 설정할 수 있어요) |
| Pass-Through | Value와는 다르게 Start / Canceled 이벤트 없이 항상 Performing 하고 있습니다. |
❔ Value 에서 여러가지 입력장치가 사용된다면, 가장 많이 입력이 발생한 장치를 따로 선정해 Trigger로 발생 시킵니다.
❔ Pass-Through는 Value처럼 값을 지정하지만, 인풋 액션의 바인딩된 모든 입력장치들의 입력을 Trigger로 발생 시킵니다.
Inintial State Check

이건 input이 비활성화 / 활성화 될 때, 키의 상태가 중립인지 체크하는 체크박스입니다.
Processors
입/출력 값을 편집해 주는 항목입니다.
추가)
사용할 스크립트에 아래와 같이 using 선언을 확인해주세요.
using UnityEngine.InputSystem;
Binding Properties

Composite Type을 수정해 인풋 값에 맞게 바인딩할 수 있습니다.
예를들어, [상-하-좌-우] 로 움직여야하는 인풋에는 2D Vector를 누르면 됩니다.

키 바인딩은 사진과 같이 'Listen'을 눌러 쉽게 path를 지정할 수 있습니다.
(한 번에 두개 이상의 입력이 필요한 액션은 Modifier로 처리 가능해요!)
Player Input
여기까지 Input System 에셋을 Edit해 주었다면,
월드에 오브젝트를 하나 생성해 Add Component > Player Input 으로 컴포넌트를 만듭니다.

| Actions | 인풋 시스템 에셋 파일로 설정합니다. |
| Default Scheme | 제어 구성을 설정합니다. |
| Auto-Switch | 사용자의 입력장치에 맞추어 제어 구성을 바꿉니다. (체크시 디폴트 스킴을 <Any>로 해주세요) |
| Default Map | 사용할 애션 맵을 설정합니다. |
| Behavior | 어떤 형태의 이벤트를 발생시킬지 정하는 속성입니다. |
Send Messages
위 사진에서 보이 듯이, 인스펙터에서 메서드 이름이 드러나있으며,
그대로 스크립트에서 메서드로 선언하면 입력에 따라 자동으로 호출됩니다.
[SerializeField]
Vector2 inputVector;
void OnMove(InputValue value)
{
inputVector = value.Get<Vector2>(); // Vector2 타입으로 저장
}
위 InputValue 매개변수는 단순히 입력 값을 포함하는 일종의 타입입니다.
Input Action Asset 에서 설정한 Control Type 으로 제네릭을 지정해 Get 메서드로 가져와 코딩이 가능합니다.
Broadcast Messages
자식 오브젝트들에게도 함수를 호출합니다.
Invoke Unity Events
함수를 연결할 수 있는 속성들이 인스펙터에 보이게 됩니다.
(Canvas > UI 에서 작업하는 것처럼, 함수를 이벤트로 연결할 수 있어요)
public void ActionMove(InputAction.CallbackContext context)
{
inputVector = context.ReadValue<Vector2>();
}
❕ 다만! Send Messages 와는 다르게, 매개변수 타입이 InputAction의 Context 구조체입니다.
public void ActionAttack(InputAction.CallbackContext context)
{
if (context.started) {
Debug.Log("Input Start");
}
else if (context.performed) {
StartCoroutine(AttackRoutine());
}
else if (context.canceled) {
Debug.Log("Input Canceled");
}
}
위 내용은 Input Action Asset에서 설정한 상호작용과 연결됩니다. (Action Type : Button의 Interactions 항목)
그래서 플레이어의 입력 시간 Threshold에 따라 로직에 맞게 코딩이 가능합니다.
여기까지 InputSystem에 대해 살짝 알아봤습니다.
InputSystem으로 플레이어의 입력에 대해 더 정밀하고 다양하게 기능하도록 개발이 가능하고,
구버전의 입력 시스템보다 플랫폼 확장에 용이한 입력 시스템이라 생각합니다.
그럼 오늘도 좋은 하루 되세요~ ♡◟(●•ᴗ•●)◞♡
'- Unity > let us all UNITE !' 카테고리의 다른 글
| [Unity] Addressable #1 (Local) (0) | 2025.06.19 |
|---|---|
| [Unity] Getting started with UniRX ( Observer Pattern ) (1) | 2025.05.22 |
| [Unity] Awake OnEnable Start (0) | 2025.05.17 |
| [Unity] Update FixedUpdate LateUpdate (0) | 2025.05.16 |
| [Unity] 터치, 입력(Input) 시스템 정리 (1) | 2025.04.25 |