Unity/정보

[Unity] New Input System

달시_Dalsi 2024. 1. 13. 00:01

New Input System 소개

현재 유니티는 개발된지 오래된 엔진으로 아래처럼 기존의 입력 시스템도 오래됐다.

이 입력 시스템은 인풋시스템이 명확하지가 않아 vr, 콘솔, 모바일, pc 등등 여러 디바이스별로 일일이 키 매핑을 직접 찾아 입력해줘야한다. 그리고 코드 작성시 input.if (Input.GetMouseButtonDown(0))  else if (Input.GetKey(KeyCode.W))

이런식으로 입력되어 보기에도 안좋아지는 단점을 가지고 있다. 이러한 것들을 해결하기 위해 유니티에서 새로운 input system을 만들어 소개한다.

기본적으로 설치된 오래된 인풋 시스템

사용 방법

새로운 input system을 사용하기 위해선 Package Manager에서 따로 설치해줘야한다. 아래 사진에서 알 수 있듯이 Input System을 검색하여 설치해주자.

 

 

설치하면 이런 경고창이 발생한다.

새로운 input system을 설치할껀지 물어보는 창이며 Yes를 눌러 유니티를 재시작 해주자.

 

new input system을 설치하면 Project Settings-Player-other settings-Active Input Handing 옵션으로 구버전, 신버전 혹은 둘 다 사용가능하니 만약 새로운 input system이 적용이 안되어 있으면 여기를 한번 살펴보자

 

이제 입력을 받아 움직일 오브젝트에 Player Input 컴포넌트를 추가해주자

컴포넌트의 Create Actions버튼을 눌러서 InputActionAsset파일을 생성해도 좋고 Create기능을 이용하여 만든뒤 적용시켜도 좋다.

 

파일을 열면 아래처럼 기본적인 세팅이 되어있다. 

왼쪽의 Action Maps - 입력받는 액션들의 카테고리로 생각하면 편하다.

 

중간의 Action - 기존 시스템에서 아래 사진 부분에 해당한다.

Action을 살펴보면 게임패드, PC, VR, 조이스틱 등등 다양한 디바이스를 액션하나로 관리 가능하다.

 

오른쪽의 Action Properties의 Action Type은 버튼 클릭인지, 값을 내보내는 것인지 구분하는 것이다.
Action Type을 value로 했을때 나타나는 밑의 컨트롤 타입으로 값의 형식을 결정할 수 있다.

Value - 입력 들어온 값에 따라 결정 (ex. '+' 값이 들어오면 오른쪽, '-'값이 들어오면 왼쪽)
Button - 버튼이 눌렸는지, 안 눌렸는지에 따라 입력 여부 결정 (ex. 점프)

 

Interactions로 호출 타이밍 지정 - +누르면 4가지 형태가 나온다. 원래 기본은 값이 변할때 호출된다.

 

Processors는 인풋 값의 후처리를 해야할때 사용한다. - 입력 반전, 노멀라이즈 등 

 

기본 세팅된 것들 말고 새로 액션을 추가해보자.

3D 캐릭터를 앞뒤좌우로 움직일 것이기에 움직임을 받는 액션을 만들어보자.

목표 움직임을 구현하기 위해선 X,Y값만 있으면 되니 Vector2로 만들 것이다.

Actions의 +를 눌러서 새로 만들어주고 오른쪽 Properties에서 Action Type - Value, Control Type - Vector2로 설정한다.

 

앞 뒤 좌 우 4개의 키를 설정해야하니 아래 사진처럼 옵션을 설정해주자

 

 

그럼 이처럼 Up, Down, Left, Right 4개가 만들어지며 현재 각 키가 No Binding으로 각각 키를 바인딩 해주면 된다. 

 

 

아래 처럼 바인딩할 액션을 선택하고 우측 Path에서 원하는 키를 선택해주면 된다.

 

설정을 끝마친 뒤 상단의 Save Asset을 누르거나 Auto-Save옵션을 체크하여 활성화 해주자.

 

 

이제 Player Input컴포넌트의 Behavior 옵션을 설정해주자.

총 4가지로 Send Messages, Broadcast Messages, Invoke Unity Events, Invoke C Sharp Events가 있다.

 

Send(Broadcast) Messages

특정 키가 입력되면 연결된 함수를 자동으로 호출되는 방식이다.

broadcast의 경우는 해당 오브젝트의 하위 오브젝트까지 제어가능한 옵션이다.

 

코드를 작성하여 이를 사용해보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    private Vector3 _vector;
    private float _speed = 10f;

    void Update()
    {
        transform.Translate(new Vector3(_vector.x, 0, _vector.y) * _speed * Time.deltaTime);
    }


    void OnTestMove(InputValue value)
    {
        _vector = value.Get<Vector2>() ;
    }
}

1. 네임스페이스를 추가 - using UnityEngine.InputSystem; 

2. 사용할 액션을 On+사용할 액션이름(액션 타입)로 함수를 만들어 사용 

OnTestMove(InputValue ~)

 

 

 

Invoke Unity(C Sharp) Events

유니티 버튼처럼 인스펙터에서 직접 호출될 함수를 선택할 수 있다. 때문에 함수이름에 정해진 규칙은 없으니 OnMessages처럼 함수앞에 On을 붙일 필요가 없다. 다만 가독성을 위해 통일 시키는 걸 추천. 

다만 Public 함수로 만들어줘야한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    private Vector3 _vector;
    private float _speed = 10f;

    void Update()
    {
        transform.Translate(new Vector3(_vector.x, 0, _vector.y) * _speed * Time.deltaTime);
    }


    void OnTestMove(InputValue value)
    {
        _vector = value.Get<Vector2>() ;
    }

    public void OnTestJump()
    {
        transform.Translate(new Vector3(0, 10, 0) * _speed * Time.deltaTime);
    }
}

 

결과

Send(Broadcast) Messages

 

Invoke Unity(C Sharp) Events