스파르타 내일배움캠프/Today I Learned

Today I Learned - Day 25 [New Input System]

불면증 도사 2024. 10. 18. 22:36

오늘 프로젝트를 진행하면서 2개의 오브젝트가 다른 액션 맵을 사용한 입력체계를 사용할 때, 하나의 오브젝트에만 적용되는, PlayerInput의 Scheme를 <any>로 두는 아주 간단한 방법으로 해결되는 이슈가 발생했었다.

그런 고로, 오늘 정리할 내용은 New Input System으로 결정하였다.

 

목차

  • New Input System이란?
  • New Input System의 기초적인 사용법.
  • 스크립트 상으로 PlayerInput 컴포넌트를 편집하는 방법

 

New Input System이란?

New Input System은 Unity 측에서 다양한 플랫폼과 입력 체계에 유연하게 대응하기 위해서 기존의 Input Manager를 대체하는 입력 시스템이다.

전체적으로 [행동 명명] → [입력 키 지정] → [행동의 명칭에 따른 함수 편성]이라는 아주 간단한 방법으로 입력 지정이 가능하고, 이를 받아오는 방식도 간단하기 때문에 이래저래 활용하기 좋은 편.

특히, 복수 조작 체계를 매우 손쉽게 제어할 수 있기 때문에, PC와 모바일, 콘솔을 아우르는 매우 방대한 호환성을 요구하는 경우가 많은 현대 게임 시장에서 상당히 강력한 요소라고 할 수 있다.

 

New Input System의 기초적인 사용법

New Input System의 사용법은 크게 4단계로 나뉜다.

  1. 시스템 기반 설정을 New Input System에 맞게 변경한다.
  2. Input Actions 파일을 생성, 작성한다.
  3. PlayerInput 컴포넌트를 인스턴스에 싣고, Input Actions 파일을 지정한다.
  4. 작성한 Input Actions에 적합한 스크립트를 작성한 뒤, PlayerInput이 실린 인스턴스에 싣는다.

이 과정을 통해서 구사할 수 있게 된다.

그럼, 각 과정을 간략하게 알아보도록 하자.

 

1. 시스템 기반 설정을 New Input System에 맞게 변경한다.

총 2단계로 구성된다.

  1. 상단 메뉴바에서 Windows - Package Manager에서 Input System을 import 한다.
  2. 상단 메뉴바에서 Edit - Project Settings - Player에서 Other Setting의 Configuration에 있는 Active Input Handling을 Input System Package 혹은 Both로 설정한다.
    [Both는 기존의 Input Manager도 함께 사용 가능하다.]

이렇게 설정하고 나면 Input System을 사용할 수 있게 된다.

 

2. Input Actions 파일을 생성, 작성한다.

Project에 적합한 폴더를 생성한 뒤, 해당 폴더에서 우클릭 메뉴 - Create - Input Actions 파일을 생성한 뒤에, 해당 파일을 작성한다.

 

그러면 우측과 같은 창이 표시되는데, 이걸 다음과 같이 조작하면 된다.

 

1. 목표로 하는 입력체계의 Scheme를 추가한다.

2. 조작 대상의 수 만큼, Action Map을 추가한다.

3. 대상의 조작에 맞춰서 Actions를 추가한다.

4. 각 Actions의 입력 변수형을 지정한다.

5. 각 Action에 입력 방식을 추가 및 할당한다.

 

 

이렇게 작성을 마쳤다면, 이제 Input Actions 파일의 작성이 완료된다.

 

3. PlayerInput 컴포넌드를 인스턴스에 싣고, Input Actions파일을 할당한다.

 

왼쪽의 스크린샷이 PlayerInput의 Inspector 표시 내용이다.

이 컴포넌트에 앞서 작성한 Input Actions 파일을 할당하고, 해당 객체에서 사용할 조작법에 맞춰서 설정하면 된다.

 

Default Scheme를 통해서 입력 체계를 변경할 수 있고, Default Map을 통해서 조작의 종류를 변경할 수 있는데, 이는 나중에 스크립트로도 수정 가능하다.

Default Scheme가 <any>면 모든 입력체계가 다 적용된다.

 

이 항목에서 주의할 점은 Behavior인데, 이 Behavior에 따라서 입력값을 적용하는 방식이 달라진다.

Send Messages는 해당 객체에 존재하는 컴포넌트에 입력값을 전달하고, BroadCast Messages는 하위 객체들에게도 입력값을 전달한다.

Invoke Unity Event는 유니티에서 지원하는 Event System과 동일한 방식으로, 객체 안의 함수를 해당 입력 이벤트에 바인딩 해서 Event로 호출하는 방식이며, Invoke C Sharp Events는 Input Actions에서 설정한 키들을 바탕으로 C#코드가 생성되는 방식이다. Save Asset으로 파일 저장도 가능.

 

4. 작성한  Input Actions에 맞게 스크립트를 작성한 뒤, PlayerInput이 실린 인스턴스에 싣는다.

이제 실제 작동을 작성할 차례다.

Send Messages 혹은 BroadCast Messages를 기준으로 Input Actions 파일에서 Actions의 항목으로 작성했던 조작명을 _Input이라고 했을 때, On_Input(InputValue value) 함수를 통해서 동작시킬 수 있다.

단, 변수 = value.변수형을 통해서 입력값을 확실하게 받아오는 절차를 거쳐야지 입력값을 쓸 수 있음에 주의.

 

이런 방식으로 Input System을 이용해서 입력값을 처리할 수 있다.

 

스크립트 상으로 PlayerInput 컴포넌트를 편집하는 방법

본 게시글을 작성한 주된 목적. 게임을 실행하는 도중에 조작을 변경하고자 한다면 Scheme는 <any>를 쓴다고 해도, ActionMap은 변경하지 않으면 다른 항목의 조작법을 적용하는 것은 불가능하다. 그러니, 한번 정리해 보자.

 

일단 PlayerInput을 스크립트로 제어하려면 PlayerInput 컴포넌트를 변수로 가지고 있어야 한다.

그러니, PlayerInput playerInput = GetComponent<PlayerInput>()을 이용해서 컴포넌트를 할당한 것을 기반 조건으로 가정하겠다.

[엄밀히는 선언을 한 이후, Awake 함수에서 할당했다고 가정한다.]

 

또한, 본문에 작성한 방식은 이해를 돕기 위해서 형태를 조금 다듬었다.

함수는 당연하게도 그대로지만, 작동 방식을 알 수 있게 하기 위해서 변수명을 앞에 붙이고 인수에도 이해하기 쉽게 이름을 다르게 적었다.

다만, 인수의 원문을 옅게 표시하니, 이를 추가로 참고하면 좋을 것이다.

 

Scheme 변경법

- playerInput.SwitchCurrentControlScheme(string SchemeName, InputDevice[] DeviceList)

[인수 원문: string ControlScheme, InputDevice[] devices]

DeviceList에 해당하는 입력체계를 적용하는 함수.

사실, Scheme는 이미 라는 범용 세팅이 있기도 하고, 써 본 적이 없어서 상세하게 설명은 불가능하다.

검색해도 잘 찾아보기가 힘든 함수.

 

ActionMap 변경법

- playerInput.SwitchCurrentActionMap(string ActionMapName)

[인수 원문: string MapNameOrID]

ActionMapName의 이름을 가진 ActionMap으로 현재 PlayerInput의 ActionMap을 변경하는 함수.

장면에 따라서 조작이 다른 경우나, 여러 가지 미니게임을 포함하고 있는 경우 등, 전체적으로 조작법의 변동 폭을 높일 수 있다. 게임이 가진 요소가 많을 수록 유용해지는 기능.

 

마치며

이렇게 Input System에 대해서 간단하게 정리해 보았다.

숙달되면 매우 편한 기능이기도 하고, '입력'에 관련된 부분이라 분명하게 알아보는 것이 좋다고 생각한다.

다만, Input System과 관련된 부분은 검색을 해도 기본적인 사용법 이외에는 잘 안보이는 편이라서 아마 깊게 찾아보는 것은 난이도가 조금 있을 것 같다.