Ad Block 한번만 꺼주시면 안될까요..?
게임 개발/유니티

Unity) Input System의 사용법, 장단점, 차이점. (입력 받기)

UniCoti(유니코티) 2024. 5. 11.

가장 먼저, Input System이란 유니티에서 "입력" 신호를 통 들어 관리하는 체계이다.

현재는 확장성 등의 이유로 구(Old) 버전과 신(New) 버전이 나뉘어 있는 상태인데,

 

구 버전은 Input.GetKey류 메서드를 통해서 코드기반으로 이벤트를 만들고,

신 버전은 미리 버튼에 대한 이벤트 함수를 만들고, 함수 안에 기능만 적으면 되는 식이다.

이해가 어려울 수 있다. 

 

비유하자면 구 버전은 하나가 생길 때마다 집을 새로 짓는 방식이고,

신 버전은 미리 입주자들을 적어서 내면 집터를 만들어주어서 입주자만 들어가면 되는 상태이다.

이렇게 이해하면 더욱 편할 것이라고 생각한다.


1. 사용법.

순서를 따지면 구 버전부터 설명하고 싶지만, 이 글의 수요는 신 버전에 대한 글 일거라 생각하여

이탈률을 줄이기 위해서 신 버전부터 적어보겠다.

 

Input System

먼저, 신 버전 Input SystemPackage manager를 통해서 설치해야만 한다.

[Window] -> [Package Manager]로 들어가면 창을 열 수 있고,

Unity Registry에 들어가서 I 쪽을 살펴보면 찾을 수 있을 것이다.

DownloadInstall, Import로 설치해 주자.

 

경고

다른 패키지들은 안 그런 경우도 많은데 Input System은 프로젝트에 적용하려면

재시작을 해줘야 해서 이러한 경고가 뜰 것이다. Yes를 누르면 자동으로 재시작한다.

아무튼 여기까지 하면 프로젝트에서 Input System을 사용할 준비는 완료된다.

이제 본격적으로 여러 가지 파일들을 만들고, 연결해줘야 한다.

Project 탭에서 [Create] -> [Input Actions]를 눌러주면 Input Actions가 생성된다.

 

이름 변경

여기서 Input Actions의 역할은 Manager 정도의 역할로 보면 좋다.

이 안에서 여러 가지 키와 버튼 등을 매핑하고, 이름을 짓고, 체계적으로 사용하는데,

그걸 모두 관리하는 가장 큰 범위의 관리자이다.

 

내부 화면

아무튼, 이걸 더블클릭하여 열어보자.

그럼 이렇게 약간 복잡해 보이는 화면이 등장한다.

 

add control scheme

여기서 "No Control Schemes"를 눌러서 "Add Control Schemes" 버튼을 눌러주자.

이때 control scheme의 의미는 통제할 구역을 나눌 때 여러 개로 나누는 용도이다.

가장 대표적으로 플랫폼을 나눌 때 "PC"와 "MOBILE"로 나누는 등으로 활용하면 된다.

이해를 위해서, "PC"로 이름을 지어주겠다.

 

이름 변경

또한 Device Type 및의 List에는 원하는 장치를 선택할 수 있는데,

 

PC에는 입력장치가 보통 키보드와 마우스이므로, 선택하고 Save 해주면 된다.

 

PC 선택된 화면

그럼 이렇게 상단에 PC라고 control scheme가 선택된 모습이 뜨게 된다.

여기까지 왔으면 이제 키를 매핑해줘야 한다. (* Mapping = 입력받을 키를 지정하거나 연결)

 

Action Maps 추가

이제 Action Maps를 추가해줘야 한다.

이것도 한 프로젝트 안에서 입력을 사용하는 분류를 하는 장치인데,

조금 더 작은 분야에서의 분류라고 생각해 주면 된다.

 

대표적으로 Player, 즉 게임 내에서의 입력과 Menu UI, 즉 로비 등의 UI 입력으로 나눌 수 있다.

Action Maps는 어느 정도 이해했으리라 생각하고, Actions도 만들어주자.

Actions는 계층 구조가 가능하여 원한다면 한번 더 나눌 수도 있다.

 

Move 밑에 만들예정

예를 들면 이렇게 Move와, Attack 이런 걸로 나눌 수도 있다.

 

초기 설정

또한 움직임의 경우에는 보통 값으로 움직일 위치를 결정하기에 Action TypeButton 말고

Value로 바꿔줘야만 한다. Button0,1 눌렸다 안 눌렸다 같은 거고 Value는 값을 의미한다.

 

아무튼, 초기에는 밑에 보면 이렇게 <No Binding> {GLOBAL}이라는 무언가가 있는데,

가볍게 지워주면 된다. 여기에 매핑이 가능하고, 매핑이 되면 No Binding 표시가 지워진다.

 

끝 부분

여기 Actions의 끝부분을 보면 이렇게 + 버튼이 있다.

 

+버튼 눌렀을 때 화면

그럼 이렇게 미리 매핑된 여러 대표적인 키배치가 있다.

여기서 우리는 WASD 키로 이동을 구현해 볼 것이기에 저걸 골라주면 된다.

 

Composite Type

또한 Composite Type2D Vector로 바꿔주자.

"상하좌우"는 2D에서의 일이다. 3D였다면 Z 축이 있어야 한다.

 

현황

그럼 이렇게 되어 있을 텐데, "No Binding"이라고 되어 있으니 키가 지정이 안되었다는 뜻이다.

Up에는 W, Down에는 S, Left에는 A, Right에는 D를 지정하여 매핑을 완료해 주자.

 

키 지정하기

키를 지정해 주려면 Path를 조절해 주면 된다. 검색하여 찾기 힘들다면 "Listen" 버튼을 누르고

직접 키보드로 그 키를 입력하면 자동으로 찾아준다.

 

완성사진

그럼 이렇게 "집터"를 만드는 데 성공했다.

이제 입주자를 집에 집어넣어 보자.

 

Player
inspector

먼저, Player 오브젝트에 "Player Input"과 스크립트를 넣어주어야 한다.

마음대로 만들어서 하나 넣어주자. (필자의 경우 "Mover")

이제 Actions에 아까 만든 Input Actions를 넣어주고, 코드 편집기로 이동하자.

 

void OnMove(InputValue value) {
    inputVec2 = value.Get<Vector2>();

    if(inputVec2 != null) {
        moveDirection = new Vector3(inputVec2.x, 0, inputVec2.y);
    }
}

 

이건 가장 대표적인 이동 함수의 예시이다.

OnMove라는 함수는 내가 정의한 게 아니라, 아까 만든 Actions의 이름 앞에 On을 붙여서

자동으로 만들어진다. 이제 이 함수 안에 원하는 기능을 담기만 하면 되는 것이다.

 

이 과정에서 입력값에 대한 자세한 정보들은 value라는 변수 안에 저장되어 있다.

변수 타입으로 지정한 값을 가져오고 싶을 때는 value.Get <type>(); 을 사용하면 된다.

아무튼 이렇게 해서 움직일 방향을 정했으면 Update()에서 이대로 움직여주기만 하면 된다.

 

2가지 정도로 나눌 수 있을 것 같은데, 움직일 방향으로 이동하는 것

움직일 방향을 "바라보고", 앞으로만 이동하는 것 정도가 생각난다.

 

움직일 방향을 바라보고 앞으로 이동하는 코드는 

"앞으로 이동"하는 코드가 항상 1 이상의 값을 지니기에 입력을 안 해도 움직인다.

따라서 inputVec2!= Vector2.zero 등의 조건을 추가해 주면 간단히 방지할 수 있다.

(입력이 없지 않을 때)

 

void Update()
{
    transform.Translate(moveDirection * Time.deltaTime);
}

 

방향을 이미 구했기에 이 정도 코드 한 줄이면 이동은 끝난다.

 

(유니티 6 Beta라서 조명 세팅이 조금 다르다)


1-1. (구) Input System

구 인풋 시스템은 세팅 이런 거 다 필요 없다.

그저 코드만 몇 줄 적으면 되는 편리성을 갖추고 있기도 하다.

또한 설명조차 필요 없을 정도로 직관적이며, 받아야 하는 입력이 만약 하나라면

새로운 Input System 보다는 (구) 버전이 낫지 않나 싶다.

 

if(Input.GetKeyDown(KeyCode.Space)) {
    print("space clicked!");
}

 

매우 직관적이다. bool 값으로 눌렀는지에 대해 판단한다.

---down은 눌렀을 때 1회, ----는 누르는 동안, -----up은 떼었을 때 1회다.

또한 키 지정은 KeyCode라는 클래스를 이용해서 특정하여 넣어줄 수 있다.


2. 장단점, 차이점

가장 먼저, 새 버전은 new, 구 버전은 old라고 부르겠다.

 

new가 훨씬 체계적이고 확장성에도 용이하며 플랫폼 전환에도 친하다는 건

부정할 수 없는 사실이고, 그게 유니티가 new를 출시한 이유이기도 하다.

하지만 newold와 달리 패키지를 다운로드하여야 한다는 점에서 조금 번거로우며

간단한 동작을 하는 경우에도 너무 과하게 체계적으로 설계되기에 불편할 수 있다.

 

과하게 체계적인 것이 안 좋은 것인가?라는 의문이 들기는 하지만

다른 사람이 보기에도 안 좋을 것이라 생각한다. 이 코드를 이해하려면

Input Actions를 들어가 봐야 할 텐데 계층을 타고 타고 내려가

기껏 봤는데 하나만 매핑되어 있어 딱 하나 이해했다면 불쾌하지 않겠는가?

 

또한 그에 맞춰 old는 매우 직관적으로 이해할 수 있다.

코드가 너무 단조로워 보기 안 좋지만, 코드 줄 수도 적어질 가능성이 있다.

하지만 if문의 반복이 생기기에 여러 번 쓰면 당연히 보기 안 좋아진다.

이러한 점에서는 장단점이 나뉘는 것 같다.

 

키의 매핑 개수가 적은 경우 old가, 

많은 경우에는 new가 더 "좋다"라고 생각된다.

 

물론 "적은"과 "많은"이라는 말은 상대적이라서 개개인마다 다르다.

그래서 보다 체계적인 new 쪽에 조금 더 손을 들어주길 희망한다.

 


이 글은 몇 년 전, 생 초보 일 때 Input에 대해 쓰면서 "새로운 input도 있다고?" 하면서

처음 알게 된 패키지인데, 그 글에도 조만간 배워서 글로 써놓겠다고 했으면서

1년 이상의 시간이 흐르고서야 지금 올려본다.

 

https://alpaca-code.tistory.com/113 ( 그 글 )

 

유니티) ArgumentException: Input Button Walk is not setup. To change the input settings use: Edit -> Settings -> Input 해결

ArgumentException: Input Button Walk is not setup. To change the input settings use: Edit -> Settings -> Input 오늘은 채팅방의 사람을 도와주다가 이러한 오류가 나왔다. 간단히 보자면, 인풋의 "Walk"가 셋업 되지 않았다

alpaca-code.tistory.com

 

사용법이 어렵진 않은데 복잡하다.

진짜 제대로 만드는 거 아니면 아직도 old를 혼용하여 만들 것 같다.

(추후에 리팩토링 하면서 고치거나...)

 

유니티 어필리에이트로 활동하면서 에셋 사용법을 적으며 처음 보는 시스템을

사용하는 것에 조금 익숙해진 것 같다. 조금 어려울 줄 알았는데 이해가 잘 되었다.

Unity Korea에도 비슷한 내용이 나와있는데, 보시는 것도 추천합니다.

 

유니티 협력 글(어필리에이트)


도움이 되었길 바라며,

 

끝.

댓글

💲 추천 글