본문 바로가기

Study/Unity Engine

[Unity] 유니티 이해하기 03 - Input System

유니티의 Input System은 플레이어 입력을 관리하고 처리하기 위해 제공되는 시스템으로, Unity의 기본적인 "Legacy Input Manager"를 대체하기 위해 개발되었다. 이 시스템은 더 모듈화되고 직관적인 입력 관리 기능을 제공하며, 다양한 플랫폼과 장치를 쉽게 지원할 수 있도록 설계되었다.


주요 특징

  1. 다양한 입력 장치 지원:
    • 키보드, 마우스, 게임패드, 터치스크린, VR/AR 컨트롤러 등 다양한 입력 장치를 지원한다.
    • 여러 입력 장치를 동시에 처리할 수 있다.
  2. 액션 기반 구조:
    • Unity Input System은 Action이라는 개념을 중심으로 동작한다.
    • 액션은 특정 입력(버튼 누르기, 축 움직임 등)을 의미하며, 플레이어의 입력과 게임의 반응 간의 연결을 간소화한다.
  3. 플랫폼 독립적:
    • 특정 플랫폼에 종속되지 않으며, 동일한 액션 세트를 사용해 다양한 플랫폼에서 일관된 동작을 유지할 수 있다.
  4. 모듈화:
    • 입력 설정이 ScriptableObject로 저장되기 때문에 재사용성과 관리가 용이하다.
    • 입력 처리 코드와 입력 설정을 분리하여 유지보수와 확장이 쉽다.

핵심 구성 요소

  1. Input Actions:
    • 입력 이벤트를 정의하는 주요 요소다.
    • Input Action Asset 파일로 관리되며, 여러 액션을 그룹화하여 하나의 "Action Map"에 저장할 수 있다.
      • 예를 들어, "PlayerControls"라는 Action Map이 있다면, 여기에는 "Move", "Jump", "Fire" 등의 액션을 포함하여 처리할 수 있다.
  2. Input Action Map:
    • 특정 컨텍스트(상황)에 사용할 액션의 묶음이다.
    • 예를 들어, "메뉴"와 "게임 플레이" 상황에서 다른 Action Map을 활성화 할 수 있다.
  3. Input Action Asset:
    • 입력 설정을 저장하는 데이터 파일이다. (.inputactions 확장자)
    • Unity의 Input System Package를 설치하면 생성 가능하다.
  4. Control Schemes:
    • 서로 다른 입력 장치를 지원하기 위해 여러 스키마를 정의할 수 있다.
    • 예를 들어, "Keyboard & Mouse"와 "Gamepad" 스키마를 설정하여 상황에 맞는 입력 처리가 가능하다.
  5. Devices:
    • Input System에서 장치를 Device로 추상화하여 처리한다.
    • 키보드, 마우스, Xbox/PS 게임패드, VR 컨트롤러 등을 지원한다.
  6. Event System:
    • 특정 입력 이벤트가 발생했을 때 코드에서 이를 처리할 수 있도록 연결하는 구조이다.
    • 예를 들어, OnMove, OnJump 등의 콜백을 처리한다.

Input System의 워크플로우

1. Input System 패키지 설치

  • 만일 설치되어 있지 않다면, Unity의 Package Manager에서 Input System 패키지를 설치한다.
  • 설치 후 Unity가 프로젝트를 재시작하며 기존 Input Manager와의 호환성을 묻는 팝업이 표시된다.
    • Yes를 선택하면 새 Input System으로 전환된다.

2. Input Actions 생성

  1. Input Actions Asset 생성:
    • Assets 폴더에서 마우스 우클릭 → Create → Input Actions 선택.
  2. Action Map 및 액션 추가:
    • 생성된 Asset을 열고, Action Map과 액션을 추가한다.
    • 예를 들어, "Move", "Jump", "Fire" 등을 정의한다.
  3. 바인딩 추가:
    • 각 액션에 입력 바인딩을 추가한다.
    • 예를 들어 "Move"는 W/A/S/D 키 또는 Left Stick으로 바인딩한다.

3. 스크립트 작성

Input System은 스크립트를 통해 액션 이벤트를 처리할 수 있다. 가령, 앞선 작업들을 다음과 같이 스크립트로 작성하여 사용할 수 있다.

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    private PlayerInputActions playerInputActions;

    private void Awake()
    {
        // Input Actions Asset 초기화
        playerInputActions = new PlayerInputActions();
    }

    private void OnEnable()
    {
        // 액션 활성화
        playerInputActions.Player.Enable();

        // 이벤트 연결
        playerInputActions.Player.Move.performed += OnMove;
        playerInputActions.Player.Jump.performed += OnJump;
    }

    private void OnDisable()
    {
        // 액션 비활성화
        playerInputActions.Player.Disable();
    }

    private void OnMove(InputAction.CallbackContext context)
    {
        Vector2 input = context.ReadValue<Vector2>();
        Debug.Log($"Move Input: {input}");
    }

    private void OnJump(InputAction.CallbackContext context)
    {
        Debug.Log("Jump!");
    }
}

 


4. Player Input 컴포넌트 사용

  • Player Input 컴포넌트를 게임 오브젝트에 추가하면, 입력 처리에 필요한 설정을 직관적으로 할 수 있다.
  • 이 컴포넌트는 입력 이벤트를 자동으로 처리하며, Unity Events나 메시지 호출 방식을 지원한다.

이러한 Input System이 아닌, 사용자의 입력에 따른 Input 처리도 가능하다.

대표적인 방법은 다음과 같다.

 

Keyboard 입력

  • Input.GetKey
void Update()
{
    if (Input.GetKey(KeyCode.W))
    {
        Debug.Log("W key is held down");
    }
}

Unity의 Legacy Input Manager 시스템에서 키보드 입력을 처리하기 위한 메서드로, 특정 키가 눌린 상태인지 확인한다.

사용이 간단하며 별도의 초기화를 요구하지 않지만, 입력 관리가 코드에 하드코딩되기 때문에 유지보수가 어렵다.

 

  • 장점:
    • 구현이 매우 간단.
    • 빠른 프로토타이핑에 적합.
  • 단점:
    • 입력 처리 로직이 코드에 직접 포함되어 있어, 재사용성이 떨어지고 유연성이 낮음.
    • 다양한 입력 장치를 지원하거나 복잡한 입력 체계를 구현하기 어려움.

 

 

  • Keyboard
using UnityEngine;
using UnityEngine.InputSystem;

void Update()
{
    if (Keyboard.current.wKey.isPressed)
    {
        Debug.Log("W key is held down");
    }
}

 

Unity의 새로운 Input System에서 제공되는 클래스로, 키보드 입력을 Keyboard 객체를 통해 처리한다.

InputSystem 패키지를 설치하고 활성화해야 사용이 가능하며, 객체 기반으로 입력을 처리하므로 확장성과 유연성이 높다. 또한 입력 관리가 Input Actions Asset과 통합될 수 있다.

 

  • 장점:
    • 다양한 입력 장치(키보드, 컨트롤러 등)와 통합하여 사용 가능.
    • 코드와 입력 설정이 분리되어 유지보수가 용이.
  • 단점:
    • 초기 설정이 다소 복잡.
    • 단순한 키 입력 처리에는 오버헤드가 있을 수 있음.

 

항목 Input.Get KeyKeyboard
소속 Legacy Input Manager New Input System
유연성 낮음 (코드에 직접 입력) 높음 (Action 기반 설정 가능)
다중 입력 장치 지원 제한적 풍부한 지원
사용 난이도 쉬움 상대적으로 복잡
추천 용도 간단한 프로토타입, 소규모 프로젝트 복잡한 입력 처리, 멀티플랫폼 프로젝트

Mouse 입력

  • Input.GetMouseButton
void Update()
{
    if (Input.GetMouseButton(0)) // 좌클릭
    {
        Debug.Log("Left mouse button is being held down");
    }

    if (Input.GetMouseButtonDown(0)) // 클릭 시작
    {
        Debug.Log("Left mouse button clicked");
    }

    if (Input.GetMouseButtonUp(0)) // 클릭 종료
    {
        Debug.Log("Left mouse button released");
    }
}

Unity의 Legacy Input Manager를 사용하는 방식으로, 마우스 버튼 입력 상태를 확인한다. 특정 마우스 버튼이 눌렸는지, 떼어졌는지, 또는 계속 눌리고 있는지를 확인할 수 있다.

특히, Update 루프에서 호출하여 입력 상태를 지속적으로 확인한다.

 

  • 장점:
    • 간단한 입력 상태 확인에 적합.
    • 입력 상태를 세밀하게 제어 가능 (누름, 눌림 종료 등).
  • 단점:
    • 특정 오브젝트와의 상호작용을 처리하기 위해 추가 로직이 필요함.

 

  • OnMouse
void OnMouseDown()
{
    Debug.Log("Object clicked");
}

void OnMouseEnter()
{
    Debug.Log("Mouse entered the object");
}

void OnMouseExit()
{
    Debug.Log("Mouse exited the object");
}

Unity가 제공하는 이벤트 메서드로, 특정 게임 오브젝트에서 발생하는 마우스 이벤트를 처리한다. 마우스와 특정 오브젝트 간의 충돌(콜라이더)을 기반으로 동작한다. 이때, Unity가 콜백 방식으로 이벤트를 처리하므로, 사용자가 별도로 상태를 확인할 필요가 없다.

 

  • 장점:
    • 특정 오브젝트와의 상호작용 처리에 최적화.
    • 추가적인 입력 상태 확인 코드가 필요 없음.
  • 단점:
    • 오브젝트에 Collider가 반드시 있어야 동작.
    • Update 방식이 아니므로, 지속적인 입력 상태 확인에는 적합하지 않음.
항목 Input.GetMouseButton  OnMouse
소속 Legacy Input Manager MonoBehaviour 이벤트
입력 처리 방식 상태 기반 (Update에서 확인) 이벤트 기반 (콜백 방식)
대상 마우스 자체 입력 특정 오브젝트와의 상호작용
사용 난이도 상대적으로 쉬움 쉬우나 콜라이더 설정이 필요
추천 용도 일반적인 마우스 입력 특정 오브젝트와의 인터랙션 처리

 


정리해보면 다음과 같다.

 

  • Input.GetKey와 Input.GetMouseButton: 간단한 입력 처리와 상태 확인에 적합.
  • Keyboard와 Input System: 복잡한 입력 관리와 멀티플랫폼 지원 프로젝트에 적합.
  • OnMouse 이벤트: 특정 오브젝트와의 상호작용 처리에 효율적.