본문 바로가기

Unity/3D Project

3D RPG - 플레이어 입력 (Input System)

New Input System

Unity는 두 개의 별도 시스템(이전 시스템과 최신 시스템)을 통한 입력을 지원합니다.

이전 Input System은 플랫폼을 변경하여 게임을 출시하려면 입력과 관련하여 작성 했던 소스코드들을 다시 고쳐야 하는 번거로움과 입력 키들이 늘어날수록 Update() 함수 크기가 방대해져 소스코드가 지저분해지는 문제점도 존재했습니다.

이러한 문제점으로 새로운 Input system을 사용했습니다.

 

새로운 Input System은 기존 입력 방식인 Update()에서의 작업이 이루어지지 않고, 특정 하드웨어(button, axis...)을 참조하는 대신 작업에 해당하는 이벤트에 의해 트리거 됩니다.

 

플레이어의 입력들을 설정해줬습니다.

스크립트 작업을 시작하기 전에, 생성했던 Input Action Asset에 들어가 Generate C# Class를 눌러 Apply 해야합니다.

 

InputManager.cs

public class InputManager : Singleton<InputManager>
{
    private PlayerInputs _playerInput;

    private Vector2 _moveVector;
    ...

    public Vector2 MoveVector { get { return _moveVector; } set { _moveVector = value; } }
    ...

    protected override void Awake()
    {
        base.Awake();

        _playerInput = new PlayerInputs();
    }
    
    private void OnEnable()
    {
        _playerInput.PlayerActionMap.Enable();

        #region Setup Move
        _playerInput.PlayerActionMap.Move.Enable();

        _playerInput.PlayerActionMap.Move.performed += OnMove;
        _playerInput.PlayerActionMap.Move.canceled += OnMove;
        #endregion
        ...
    }
    
    private void OnDisable()
    {
        #region Release Move
        _playerInput.PlayerActionMap.Move.performed -= OnMove;
        _playerInput.PlayerActionMap.Move.canceled -= OnMove;

        _playerInput.PlayerActionMap.Move.Disable();
        #endregion
        ...
    }
    
    public void OnMove(InputAction.CallbackContext context)
    {
        if (context.performed)
        {
            _moveVector = context.ReadValue<Vector2>();
        }

        if (context.canceled)
        {
            _moveVector = Vector2.zero;
        }
    }
    
    ...
}

각 액션 등록 시 OnEnable()과 OnDisable()에서 MonoBehaviour 구성 요소에 포함된 Actions 및 Action Maps를 수동으로 활성화/비활성화를 해줘야합니다.

 

OnMove() 함수를 PlayerActionMap.Move 에 이벤트 함수로 등록해줍니다.

이제 Move 액션에 바인딩했던 입력 키들(WASD)를 누르면, 이벤트로 등록했던 OnMoveInput() 함수가 호출됩니다.

 

InputManager의 상속을 보시면 Singleton<> 을 상속받고 있습니다. 이 싱글톤 패턴은 디자인 패턴 목록에서 다루도록 하겠습니다.

 

 

전체 코드

https://github.com/HerFS/Unity-RPG/blob/main/Assets/_Scripts/Manager/InputManager.cs