Unity

Unity New InputSystem 사용방법

CommitGuy 2024. 11. 22. 12:12

유니티 패키지에 InputSystem이 생겼습니다.(사실 생긴지는 꽤 된거 같은데 제가 사용을 시작한지 얼마되지 않았습니다)

New InputSystem을 사용하기 전에는 여러 입력 디바이스, 예를 들어 키보드와 마우스 / 게임패드 / 모바일 터치 등에 대해 따로 처리를 해주어야 했습니다.

 

하지만 새로운 InputSystem을 사용하게 되면 여러 입력 디바이스에 대해 다 따로 구현할 필요 없이 한방에 해결할 수 있다는 이점이 있습니다.

 

설치 및 설정

먼저 PackageManager에서 InputSystem 패키지를 설치를 해줍니다

InputSystem

설치 후 Project Setting에 들어가면 Active Input Handling이라는 설정을 볼 수 있는데 Both로 설정 한다면 이전 InputSystem과 새롭게 설치한 NewInputSystem 양쪽을 다 사용할 수 있게 됩니다.

만약 New로만 되어 있다면 이전 Input System은 사용할 수 없게 됩니다

 

New InputSystem을 사용하기 위해 Input Actions 에셋을 생성해보도록 하겠습니다

Project창에서 오른쪽 클릭 후 Create > Input Actions를 클릭하면 생성됩니다

Input Actions 생성 방법

생성한 InputActions에 들어가보겠습니다.

Action Maps, Actions 등의 창이 보이는데 

ActionMap은 Action을 구성하는 곳으로 예를들어 플레이어의 움직임이 있고 그 플레이어가 차를 탄다면 플레이어의 움직임에 대한 것과 차량을 움직이는 것에 대해 따로 두기 위해 ActionMap을 따로 둘 수 있게 하는 것입니다.

 

InputAction Asset

InputActions 창

ActionMap을 만들어 보겠습니다.

여기선 캐릭터를 간단히 움직이는 예제로 InputSystem을 사용해보겠습니다

ActionMap을 먼저 생성하고 그 다음 ActionMap에 들어갈 Action들을 생성할 수 있게 됩니다. Action을 생성할때 여러 타입들이 있는데 Value, Button, PassThrough가 있습니다

Value는 지속적인 입력에 대한 처리를 위한 것으로 예를 들어 캐릭터의 움직임 같은 것이 이에 해당합니다

Button은 말 그대로 버튼을 눌렀다 땠다 할때의 동작입니다

Pass Through는 Value와 유사한데 저도 정확히 잘 모르겠습니다 사실,,, (머쓱 -_-;;)

 

Add Binding

Action을 만들고 나면 Action에 Binding할 값을 만들어야 합니다

생성한 Action 오른쪽 끝에 + 버튼이 있는데 이를 클릭하여 Binding을 생성합니다 (Add Binding을 클릭)

그 후 이름을 짓고 Path에서 어떤 키에 매필할것인지를 설정한 후 Save Asset을 클릭해 저장합니다

 

PlayerInput Component

이제 만들어진 InputAction 에셋을 이용해보도록 하겠습니다

PlayerInput Component를 추가합니다

PlayerInput Component

PlayerInput Component에 앞서 만든 Input Action Asset을 할당합니다

DefaultMap을 보면 앞서 만든 Action Map이 할당되어져 있습니다

Behaviour에 보면 4가지 설정값이 보입니다

SendMessages와 Broadcast Messages는 Unity의 Send Message 기능을 사용해 특정 함수를 호출하는 방법이고

Invoke UnityEvents와 Invoke CSharp Event는 Unity나 C#의 Event 기능을 사용하는 방법입니다

 

SendMessages & BroadcastMessages

SendMessages와 Broadcast Message의 경우 특정 키 입력을 인식하면 특정 함수를 자동으로 호출하는 기능으로 

Boradcast Message의 경우 하위 계층에 있는 Child Object들까지 제어가 가능하다는 차이점이 있습니다

 

함수 명이 "On" + [Action Name]으로 구성되어야 합니다

 

Invoke Unity Events

Invoke Unity Events를 선택하면 3가지 이벤트가 보이는데 차례대로 

Device Lost Event는 입력 장치와의 연결이 끊어졌을때 호출되고

Device Reaggain Event는 입력장치와의 연결이 다시 재연결되었을때

Controls Changed Event는 입력장치가 바뀌었을 때 호출됩니다

invoke unity events

Events를 보면 내가 만든 Action Map이 보이는데 클릭하면 내가 만든 Action들에 대한 콜백도 등록해줄수 있습니다

 

Invoke C# Events

Invoke C# Events는 C# 이벤트를 코드로 등록하고 사용할 수 있습니다

PlayerInput 컴포넌트를 가져와 onActionTriggered에 콜백함수를 등록합니다. 

invoke csharp event

콜백함수 안에 보면 CallbackContext가 performed일때 코드를 실행하는 것을 볼수 있는데 이는 사실 콜백 함수가 3가지 단계로 3번 호출되기 때문에 그중 실행했을때만 호출시키기 위함입니다

콜백 함수는 3가지 단계로 호출되는데

첫번째로는 입력기기로 부터 입력이 실행되었을때, 두번째로는 입력이 지속적으로 실행되고 있을때, 세번째로는 입력이 멈췄을때입니다.

예를 들어 스페이스 바를 누르는 입력이라고 하면 스페이스 바를 눌렀을때, 스페이스바가 눌려지고 있을때, 스페이스바에서 손가락을 때었을때 이렇게 3가지 단계로 호출되게 됩니다

입력이 실행될때 딱 한번만 호출되고 싶기 때문에 3가지 단계중 performed 일때만 호출되게 코드를 구성한것입니다

 

이상 새로운 InputSystem을 사용할때 PlayerInput Component와 함께 사용하는 방법에 대해 알아보았습니다

사실 이 방법 보다는 InputSystem을 C# 코드로 만들어 코드에서 직접 사용하는 방법을 더 많이 사용합니다. 그 방법은 다음 포스팅에서 작성해보도록 하겠습니다

반응형