유니티/공통

유니티 - InputSystem에 대해 알아보자#1(기본)

근본넘치는개발자 2024. 10. 15. 22:27

오늘은 InputSystem에 대해 알아보고자 합니다.

 

그동안 유니티를 다루면서 Old Input System이라고 할까요?

(찾아보니 Input Manager라는 명칭이 있었네요.)

 

이 방식으로 주로 작업을 하다가

제대로 InputSystem을 사용해 보려고 하니 모르는 부분이 꽤 많이 나오더군요. 

 

(이것도 원래는 New Input System이라고 했었는데

이름이 InputSystem으로 바뀌었네요.)

 

정리가 한번 필요할 것 같아서 글을 작성해 봤습니다. 

 

 

Input System을 사용하려면 먼저 패키지 메니저에 가서 추가를 해줘야 합니다.

2023.3x이후 버전에서는 기본적으로 탑재가 되어 있으니

만약 설치되어 있다면 이 부분은 넘어가셔도 됩니다.

 

 

 

설치하고 다음과 같은 창이 뜨면 YES를 눌러

재시작해 주시면 기본적인 세팅이 완료되었습니다.

 

 

 

이제 Input Manager 더불어 inputSystem을 사용할 수 있게 되었습니다.  

 

Project Setting -Player에서 변경된 모습 확인 가능

 

 

이제 우클릭을 통해 Input Action을 만들 수 있습니다.

 

맨 아래 Input Actions 추가 된 것 확인 가능

 

 

 

원하는 오브젝트의 인스펙터 창에서 Add Component를 눌러
PlayerInput을 추가해 주고 여기에 만들어둔 Input Action을 등록해 사용하면 됩니다.

 

Create Action을 눌러서 Input Action을 바로 생성할 수도 있는데,

저는 경로 문제로 정상 작동이 안 되더라고요.

Input  Action 버튼 생성 내부 로직에 문제가 있는 건지 직접 만드는 건 또 잘 되던데;; 

 

아무튼 Input  Action을 클릭해 내부를 확인해 보면 다음과 같습니다.

 

ActionMap과 Actions라고 적힌 걸 확인하실 수 있는데,

여기에 우리가 원하는 입력값들을 넣어 작동하는 방식입니다.

 

Input System을 사용하면 여러 제어장치를 한 번에 관리할 수 있습니다.

 

All Control Schemes - Add Control Sheme를 통해

원하는 입력 방식을 추가할 수 있습니다.

 

선택하는 방법은 우클릭하시면 됩니다.

 

저는 키보드와 마우스를 넣은 Scheme를 만들었습니다. 

 

Save를 눌러주면 Action Maps와 Action에

다음과 같이 추가 된 것을 확인하실 수 있습니다.

 

 

 

Action Properties를 통해 입력받는 type을 정해 줄 수 있습니다. 

 

value :

지속적으로 값을 변화하고자 할 때 적합

( 가장 많은 입력이 발생한 장치만 트리거로 처리)

 

Button :

누를 때 한 번만 동작해야 하는 경우에 적합 

 

Pass Through :

value와 비슷하지만, 모든 입력을 트리거로 발생해 처리

 

 

 

입력 형식을 정할 수 있음

 

 

interactions는 상호 작용 기능 추가,

Processors는 입력을 편집하는 기능입니다.

 

 

 

예시

Hold를 추가해 특정 키를 누르고 있는 동안의 처리를 손쉽게 가능

 

 

플레이어의 움직임을 위해서 다음과 같이 추가했습니다.

 

 

 

참고로 Vector2를 골랐을 때만 저렇게 나오는 겁니다.

각 Action Type과 Control Type에 따라 조금씩 달라집니다.  

 

한 번에 여러 개의 동작을 관리하고 싶으시다면

One Modifier를 눌러주시면 됩니다.

(ex : shift와 공격키를 동시에 누르면 더 강한 공격이 나간다던지 등)

 

저는 4방향으로 움직이게 하고 싶어서 Up ~ Composite를 눌러주었습니다. 

 

 

 

 

 

binding에서 Path를 등록할 때 클릭으로 찾지 마시고

넣고 싶은 키보드 키 누르면 자동으로 찾아주더라구요.

참고하시면 좋을 것 같습니다.

 

이름을 바꿔서 다음과 같이 만들었습니다. Save Asset을 눌러 저장해주시고 

 

Player Input Component 창에 넣어주었습니다.

 

 

아래 OnMove라고 표시한 부분이 보이시나요? 

이전에 Actions에서 만들었던 Move를 OnMove라는 함수로 호출할 수 있게 되었습니다.

 

 

또한 Move의 Control Type을 Vector2로 정했으니

입력받은 값을 Vector2의 형태로 가져올 수 있습니다.

 

InputValue는 단순 매개변수를 포함하는 타입이라고 합니다.

 

※ Action Type이 "value"인 경우, 입력과 입력되지 않을 때로,  두 번 호출 된다고 합니다. 

 

https://daekyoulibrary.tistory.com/entry/Unity-New-Input-System-2-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0

 

 

Default Scheme

Input Actions 내 존재하는 Scheme를 설정해 주는 기능이고

(아까 마우스랑 키보드 넣어준 부분)

 

Auto-Switch

입력에 따라 자동으로 등록된 기기의 구성으로 바꿔주는 기능입니다.

 

Default Map

Map을 가져와 설정해 주는 기능입니다. (Action Map에 Player )

 

 

Behaivior의 종류를 보면 다음과 같이 있습니다. 

 

 

Send Messages

지금까지 진행한 기본 방식입니다. 

 

Broadcast Message

자식 오브젝트들까지 제어가 가능합니다.

 

Invoke Unity Events

유니티 이벤트 호출 방식처럼 함수를 호출할 수 있습니다.

( UI 버튼 설정하듯이 +를 통해 원하는 함수를 추가하는 방식 )

 

 

다만 Invoke Unity로 설정했을 경우

함수의 매개변수 타입이 InputAction.CallbackContent을 사용해야 하며

값을 받아 올 때도 ReadValue를 통해 받아와야 합니다. 

 

ActionMove라고 임의로 매서드 명을 지은겁니다. 큰 의미 없습니다.

 

 

또한 이때의 방식은 한번 입력 시 입력상태에 따라서 세 번이 호출됩니다. 

 

따라서 

입력 시 - started 

입력 성공 시 - performed

입력 취소 시 - canceled

 

로 원하는 입력상태에 따른 추가 처리를 해줘야 합니다.

 

 

이렇게 오늘은 간단하게 InputSystem에 대해 알아보았습니다.

후에 알게 된 사실인데 지금까지 한 방식이 playerInput Component 방식이라고 합니다.

이 외에도 3가지 방식이 더 있는데 아래 추가 작성한 내용을 링크로 남깁니다.

 

2024.10.17 - [유니티/공통] - 유니티 - InputSystem에 대해 알아보자#2(내용 보충)

 

참고한(혹은 하면 좋을) 자료

https://youtu.be/dsLBzrbo-Vs?si=uvui1ruTwsSL6VFy