∥ New input system이란?
유니티 2019.1부터 제공하기 시작한 말 그대로 새로운 input 시스템이다.
∥ New Input System VS Old Input Manager 둘의 차이?
유니티에 기존에 탑재되어있던 InputManager에선, 여러 플랫폼으로 게임을 제작하기 위해 아주 많은 설정이 필요했다. 예를 들어 Jump이라는 동작을 수행한다고 치자. 그럼 inputManager에선
- 새 Jump를 만들고, 키보드 Space에 할당
- 새 Jump를 만들고, joystick의 A 키에 할당
- 새 Jump를 만들고, 기타 지원 기기의 X 키에 할당
- (위 작업을 반복...)
하는 식으로 지원하는 기기마다 키를 추가해줘야 했다. 사용자가 현재 어떤 기기로 이 게임을 플레이하는지 알아내는 것도 개발자가 직접 해야 하는 건 덤이다.
그러나 New Input System은 그렇지 않다. 기존 인풋 매니저보다 나아진 점을 간단히만 정리해봐도 다음과 같다.
- 기본적으로 모든 플랫폼 지원, 플랫폼 변경 이벤트 지원
- 훨씬 더 개선된 UI
- 엔진 상에서 액션에 쉽게 대응
그러나 현재로서는 개발 단계이며, 알려지지 않은 버그가 존재할 수도 있다.
∥ New Input System 적용하기
유니티에서 새 프로젝트를 시작하면 기본값은 Input System으로 되어있다. 그러니 new input system을 적용하기 위해선 몇 가지 설정이 필요하다.
우선 Window > Package Manager 로 가서 좌측 위 Packages를 Unity Registry로 설정한 후, Input System을 찾아주자.
만약 Input System이 설치되어 있지 않다면 새로 설치해준다.
그다음 Edit > ProjectSettings > Player로 가서 Active Input Handling을 찾아 시스템을 Input System Package로 바꿔준다.
이 뒤에 무슨 알림 창이 뜨는데 대충 Old Input Manager를 끌 거냐는 소리다. Yes를 눌러주자.
마지막으로 프로젝트 세팅의 Input System Package로 가서 Create settings asset을 눌러준 다음,
설정창 하단 Supported Devices를 추가해준다.
∥ Input Manager 설정하기
오른쪽 마우스 > Create > InputActions를 눌러 새 액션을 만들어 준다.
생성된 에셋을 눌러 Edit Asset 해주면
이렇게 새 창이 뜬다.
이 화면에 보이는 용어들을 짚어보자.
Control Scheme : 특정 키 입력을 사용하기 위해 필요한 요구사항의 집합. 예를 들어 키보드+마우스나, 게임패드+마우스처럼 특정 입력 도구 집합을 사용할 때, Action에 바인딩된 키를 다르게 할 수 있다. Scheme가 달라도 ActionMap과 Action 구조는 항상 같다.
Action Maps : UI에서 작동하는 키 입력 방식과 플레이어에게 필요한 키 입력 방식은 다르다. 작동 중인 Action Map을 변경함으로써 그걸 구현할 수 있다.
Action : 실제 액션 이름과 그에 할당된 키 값은 이곳에 작성한다.
이제 플레이어를 움직이는 간단한 작업을 해보자.
Action Maps - Player,
Actions - Move를 새로 생성해주고,
Action Properties - Action - Action Type를 Value, Control Type를 Vector2로 한다.
일단 키보드 입력을 넣어볼 것이므로, + 버튼을 눌러 두 번째를 클릭한다.
그러면 4가지 방향이 뜨는데, Path를 알아서 설정해준다. 사진의 경우 키보드 화살표 키를 사용했다.
위 옵션으로 있는 AutoSave를 켜지 않는 이상 자동 저장이 되지 않으므로, ctrl+S 나 Save Asset 버튼을 통해 저장하자.
∥ 플레이어 움직이기
스크립트 작업을 시작하기 전에, 우리가 생성했던 Input Action Asset에 들어가 Generate C# Class를 눌러 Apply 한다.
그렇게 해서 위와 같이 같은 이름의 스크립트가 생성되어야 한다. 우리는 이걸 불러오는 식으로 작업할 것이다.
이런 초간단 플레이어를 만들어준 다음, 아래와 같은 움직임 스크립트를 붙여준다.
using UnityEngine;
using UnityEngine.InputSystem;
public class MyPlayerScript : MonoBehaviour
{
MainInputAction action;
InputAction moveAction;
private void Awake()
{
action = new MainInputAction();
moveAction = action.Player.Move;
}
private void OnEnable()
{
moveAction.Enable();
moveAction.started += Started;
moveAction.performed += Performed;
moveAction.canceled += Canceled;
}
private void FixedUpdate()
{
Vector2 keyboard_vector = moveAction.ReadValue<Vector2>();
MOVE(keyboard_vector.x, keyboard_vector.y);
}
private void OnDisable()
{
moveAction.Disable();
moveAction.started -= Started;
moveAction.performed -= Performed;
moveAction.canceled -= Canceled;
}
void Started(InputAction.CallbackContext context)
{
Debug.Log("started!");
}
void Performed(InputAction.CallbackContext context)
{
Debug.Log("performed!");
}
void Canceled(InputAction.CallbackContext context)
{
Debug.Log("canceled!");
}
void MOVE(float _x, float _y)
{
this.transform.position = new Vector2(this.transform.position.x + _x, this.transform.position.y + _y);
}
}
실행해보면, 이제 플레이어가 자유롭게 움직이는 모습을 볼 수 있다.
이 이상의 활용법은 공식 문서를 참고하자.
∥ 참고 문서
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Settings.html
https://blog.unity.com/kr/technology/introducing-the-new-input-system
https://medium.com/nerd-for-tech/moving-with-the-new-input-system-unity-a6c9cb100808