[Unity] Input Action을 사용해야 하는 이유

박민주·2022년 3월 9일
1

Unity

목록 보기
21/40
post-thumbnail

Unity의 기존 Input 클래스보다 Input Action 클래스 를 사용하면 좋은 점이 무엇일지 정리해보려 한다

저번에 잠깐 써봤을 때 개인적으로 편했던 점은
각 입력에 대한 callback을 등록할 수 있어서, 키에 할당된 기능을 파악하는 게 더 직관적이라고 생각되었다.
그리고 Input action asset을 통해 현재 사용하는 입력키들이 무엇인지 한 눈에 알 수 있었다.

근데 이건 짧은 경험이라서 Input Action이 진짜 더 나은가에 대한 확신을 가지기 어려웠다.
그래서 조금 더 명분을 알아보고 정리해보았다.

1. 플랫폼 간 제어를 쉽게 만든다.

- 키보드, Xbox 컨트롤러, PlayStation 게임패드 등을 통해 동일한 작업을 수행하도록 개발하는 것이 더 수월
- 모든 장치를 일관되고 동기화된 상태로 유지

2. 편집기를 통해 Action Maps, Actions 등을 쉽게 편집할 수 있다.

- 또한 현재 사용되는 입력들에 대해 한 눈에 파악할 수 있다.

3. 이벤트로 작동되기 때문에 Update()에서 계속 확인하지 않아도 되어 이산 입력에 최적화된다.

- 단 스틱과 같은 연속 입력에는 폴링과 정기적인 업데이트가 여전히 필요

4. 런타임 중에 현재 활성화된 입력을 빠르게 확인할 수 있는 입력 디버거가 내장되어 있다.

- 추가 샘플을 설치하면 플레이 하는 동안 화면에 게임패드/기본입력을 직접 시각화 가능

단점이라면 입력을 구현하기에 앞서 해주어야 할 것이 많다.
그냥 쓸 수 없고 Input Action Asset을 만들어 일일히 등록해주어야 한다.
그리고 코드에서도 이벤트 활성화/비활성화 처리를 다 해주어야 해서 추가 작업이 필요하다.

그럼에도 불구하고 기존 입력 방식과 비교했을 때 더 나은 점이 있는 것 같다.

기존 입력 방식 (Input)

- 특정 하드웨어(button, axis 등)를 게임의 기능에 직접 매핑하는 형식

  • 장치에 의존되고 나중에 재구성이 어려움
  • 다른 유형의 입력 컨트롤을 처리하는 경우 Update()에서의 if문에 계속 추가해주어야 함
  • 플레이어가 컨트롤을 자신의 스타일에 맞도록 다시 매핑하게 하기 어려움

새로운 입력 시스템 (Input Action)

- 특정 하드웨어(button, axis 등)을 참조하는 대신 작업에 해당하는 이벤트에 의해 트리거됨

점프의 예시.

  • 아래 사진처럼 binding 되는 키만 여러 개 등록해주면 됨
  • 게임패드나 키보드에서 "점프"에 해당하는 입력이 실행되면 "점프"이벤트를 트리거하고 콜백으로 "점프" 기능이 사용됨
  • 아래 사진처럼 플레이어가 자신의 컨트롤에 맞게 지정하도록 하는 기능도 더 수월하게 개발할 수 있음

예제코드

- 각 액션 등록 시 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

profile
Game Programmer

2개의 댓글

comment-user-thumbnail
2023년 8월 15일

감사합니다 당신 위한 당신의 친절한 설명!

답글 달기
comment-user-thumbnail
2023년 10월 8일

도움이 되었습니다. 감사합니다!

답글 달기