Unity의 기존 Input 클래스보다 Input Action 클래스 를 사용하면 좋은 점이 무엇일지 정리해보려 한다
저번에 잠깐 써봤을 때 개인적으로 편했던 점은
각 입력에 대한 callback을 등록할 수 있어서, 키에 할당된 기능을 파악하는 게 더 직관적이라고 생각되었다.
그리고 Input action asset을 통해 현재 사용하는 입력키들이 무엇인지 한 눈에 알 수 있었다.
근데 이건 짧은 경험이라서 Input Action이 진짜 더 나은가에 대한 확신을 가지기 어려웠다.
그래서 조금 더 명분을 알아보고 정리해보았다.
- 키보드, Xbox 컨트롤러, PlayStation 게임패드 등을 통해 동일한 작업을 수행하도록 개발하는 것이 더 수월
- 모든 장치를 일관되고 동기화된 상태로 유지
- 또한 현재 사용되는 입력들에 대해 한 눈에 파악할 수 있다.
- 단 스틱과 같은 연속 입력에는 폴링과 정기적인 업데이트가 여전히 필요
- 추가 샘플을 설치하면 플레이 하는 동안 화면에 게임패드/기본입력을 직접 시각화 가능
단점이라면 입력을 구현하기에 앞서 해주어야 할 것이 많다.
그냥 쓸 수 없고 Input Action Asset을 만들어 일일히 등록해주어야 한다.
그리고 코드에서도 이벤트 활성화/비활성화 처리를 다 해주어야 해서 추가 작업이 필요하다.
그럼에도 불구하고 기존 입력 방식과 비교했을 때 더 나은 점이 있는 것 같다.
- 특정 하드웨어(button, axis 등)를 게임의 기능에 직접 매핑하는 형식
- 특정 하드웨어(button, axis 등)을 참조하는 대신 작업에 해당하는 이벤트에 의해 트리거됨
- 각 액션 등록 시 OnEnable()과 OnDisable()에서 활성화/비활성화 해주어야 함
using UnityEngine;
using UnityEngine.InputSystem;
public class HeroController : MonoBehaviour
{
private DefaultPlayerActions _defaultPlayersActions;
private InputAction _moveAction;
private InputAction _lookAction;
private void Awake() {
_defaultPlayersActions = new DefaultPlayerActions();
}
private void OnEnable() {
_moveAction = _defaultPlayersActions.Player.Move;
_moveAction.Enable();
_lookAction = _defaultPlayersActions.Player.Look;
_lookAction.Enable();
_defaultPlayersActions.Player.Jump.performed += OnJump;
_defaultPlayersActions.Player.Jump.Enable();
}
private void OnDisable() {
_moveAction.Disable();
_lookAction.Disable();
_defaultPlayersActions.Player.Jump.Disable();
}
private void OnJump(InputAction.CallbackContext context) {}
}
참고
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Actions.html
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/api/UnityEngine.InputSystem.InputBindingComposite.html
https://medium.com/codex/why-you-should-use-unitys-new-input-system-268773863c4
감사합니다 당신 위한 당신의 친절한 설명!