(화)2024.10.08 자 TIL
유니티에서 기존 Input System의 여러 고질적인 문제들을 고쳐서 새로 만든 Input System을 사용해보자.
이 글에서는 New Input System을 이용해 캐릭터를 움직여보고, 캐릭터가 마우스 방향을 바라보고, 좌클릭을 통해 투사체를 발사하는 것까지 다룰 것이다.
현재 기본으로 사용되고 있는 Input System은 구 Input System이고, 다음과 같은 방식으로 New Input System 패키지를 적용하여 사용할 수 있다.
Windows> Package Manager> +버튼 옆 Packages:를 Unity Registry로 변경> 검색창에 Input Manager 입력> Install & Import 및 재시작
❓ 근데, 기존 Input System의 문제점이 뭐지?
키보드, 조이스틱과 같은 여러 컨트롤러에 대해 설정하거나, 키를 변경하여 리바인딩하는 부분이 어렵다. 입력 처리와 실제 로직 처리를 분리하지 않았다. 분리를 하지 않으면 유지보수가 굉장히 어려워진다. 분리를 하면 확장성과 유지보수성을 높일 수 있다.입력처리 따로, 실제 로직 따로, 이렇게 하나의 대상이 하나의 역할만 하는 것을 객체지향 프로그래밍에서 단일 책임 원칙(Single Responsibility Priciple)이라고 한다.
그럼 본격적으로 New Input System을 이용해서 캐릭터를 움직여 보자.
먼저 사용자가 지정한 동작의 입력 처리를 감지해서 데이터를 넘겨주는 역할을 하는 Input Actions를 하나 만들어 준다. 여기서 여러 컨트롤러에 키맵핑을 해주는 거라고 생각하면 편하다.
역할에 맞는 이름을 지어주자. 나는 여기서 2D TopDown형식의 게임의 동작을 입력받는 컨트롤러를 만들고 싶으니 TopDownController2D라고 해줬다. 그다음 Edit asset을 클릭하거나 Project에서 TopDownController2D를 더블클릭해서 창을 열어준다.
열면 다음과 같은 창이 뜬다.
여기서 Add Control Scheme을 하나 만들어 주는데, 어떤 장치로 입력을 받고 어떤 입력을 어떻게 처리할 건지 정해준다. 따라하다 보면 이해가 될 거다.
역할에 맞게 적절히 이름을 지어준다. 나는 키보드와 마우스를 이용한 컨트롤러를 만들 것이다.
List is Empty 부분의 +부분을 눌러서 Keyboard를 눌러준다. 여기서 클릭이 안되는 분이 있을 수 있는데, 우클릭을 하면 눌러진다.(왜 그런진 나도 모름)
Keyboard의 Keyboard까지 체크(Usages기능이 뭔진 나도 아직 잘 모른다)
Keyboard를 추가했던 것처럼 Mouse도 똑같이 추가하고 Save를 누른다.
그러면 Keyboard와 Mouse를 컨트롤러로 쓰는 Scheme을 하나 만들었다. 이제 Scheme을 채워주자(Scheme이 영어로 계획이나 도식이라고 한단다. 여기선 도식에 더 알맞을 것 같다)
아무튼 Action Maps에서 +버튼을 눌러 Action Maps를 하나 추가해주고 Action의 주체나 사용용도에 알맞게 이름을 만들어 준다.
Actions에 내가 구현할 동작들의 이름을 작성해준다. 여기서 필자가 작성한 Actions의 역할은 각각 오브젝트 이동(Move), 마우스 위치 감지(Look), 마우스 왼쪽 클릭(Fire)이다. 여기서 작성한 Actions의 이름의 앞에 On이 붙어서 나중에 스크립트에서 OnMove, OnLook, OnFire같은 형식으로 사용하게 된다.
만약 Move에서 설정한 wasd키가 감지되었다고 하면 스크립트에 작성해둔 OnMove함수가 자동으로 실행되는 방식으로 구현된다.
이제 이름을 붙인 동작들에 감지할 동작을 넣어보자. Move와 Look은 Vector2타입으로 매개변수를 받을 예정이므로 Action Type을 Value로 만들어 준다. 그리고 Value로 만들면 Initial State Check가 Control Type으로 바뀔텐데 이것을 Vector2로 바꿔준다.
Fire는 float타입을 받을 예정인데 Move, Look과 똑같이 Action Type은 Value로 설정해주고, Action Type은 Any로 설정해준다. Any는 눌렀다 안눌렀다를 평가하기 편한 타입이다.
값을 받아올 타입을 정했으면, 어떤 동작이 들어왔을 때 호출하는지를 이제 설정해준다.
Move에 기본으로 생성된 바인딩은 지워주고, 옆에 +버튼을 눌러 2번째를 선택해준다. Vector2 타입은 축이 2개인데 그 중 많이 쓰는 움직임 바인딩을 자동으로 맞춰서 생성해준다.
클릭하면 다음과 같이 생성된다. 이제 각각의 Up, Down, Left, Right 키를 뭐로 쓸 건지 할당해주면 된다.
이동을 wasd로 한 번 구현해보자. Up의 Path를 클릭하고 키보드의 w를 눌러준다.
그리고 리스트에 나온 w키보드를 선택해주면 Up은 w를 통해 움직임을 감지하게 된다. 나머지 asd도 똑같이 넣어주자.
마우스의 위치를 감지하는 Look Action은 Path에서 Mouse 선택
그리고 마우스의 위치를 감지해야 하니 Position 선택
여기까지 잘 따라왔다면 이젠 Fire를 설정하러 가보자.
Fire는 마우스의 좌클릭을 감지해야 하니까 역시 Mouse클릭
그리고 드래그를 내려서 Left Button을 찾아서 선택해주자.
이제 Input Actions에서 KeyboardMouse컨트롤러의 감지할 동작에 대한 설정이 모두 끝났다. 위쪽의 Save Asset 버튼을 눌러서 저장해주자.
저장완료. 훌륭하다. 이제 지금 만든 Move, Look, Fire동작이 감지되면, 사용자가 만든 스크립트의 OnMove, OnLook, OnFire 함수들이 각각 실행될 것이다. 이제 몇 가지 컴포넌트 설정만 마치면 나머지는 스크립트에서 구현하면 된다.
내가 움직일 객체(여기선 Player를 움직일 것이다)를 선택해서 Add Component를 누르고 Player Input을 검색해서 넣어준다.
여기서 Player Input이 뭔데? 난 이런 거 만든 적 없는데? 라는 의문이 들 수도 있는데 이건 우리가 다운받은 Input System의 패키지에서 제공해주는 컴포넌트다. 방금 설정한 키 맵핑을 오브젝트와 연결해서 조작할 수 있게 만들어 주는 역할을 한다.
Player Input을 추가해줬으면 Default Scheme에 우리가 방금 만든 동작에 대한 감지 방법들이 들어있는 Input Actions를 넣어준다.
Default Map은 클릭해보면 KeyboardMouse 하나만 있는데, 지금은 Any를 쓰든 KeyboardMouse를 쓰든 상관 없다. 나중에 여러 컨트롤러를 사용하게 되면 기본 컨트롤러를 설정할 수 있다.
그리고 마지막으로 Behavior 설정이 있는데, 이것은 방금 작성한 키 맵핑을 어떤 방식으로 활용할 것인지를 결정하는 것이다. 여기서 우리가 사용하는 것은 Send Messages인데 사실 아까 언급한 OnMove, OnLook, OnFire이런 함수를 사용하게 되는 게 이 방법이다. Send Messages는 이 오브젝트의 모든 컴포넌트에 메세지를 날리는 방식이다. 여기선 Send Messages 이외의 방식을 사용하진 않을 것이고 나머지는 간단하게 소개만 하고 넘어가겠다.
Broadcast Messages는 Send Messages 방식에서 메세지를 자식 컴포넌트에게까지 날리는 방식이다. 이 방식이 편할 때도 있지만, 성능상의 문제로 잘 추천하진 않는다고 한다. Invoke Unity Events는 Unity에서 Button에 동작을 추가할 때처럼 동작을 등록해서 사용하는 방식이다. Invoke C Sharp Events는 PlayerInput.OnActionTriggered 라는 액션에서 어떤 이벤트인지 확인해서 사용하는 방법인데, 어차피 지금 사용안 할 거니 몰라도 된다. 나머지는 다 좋은 방법이니 나중에 골라서 사용하면 될 것이다.
아무튼 이렇게 New Input System을 이용해 내가 사용할 Action을 설정해서 key를 맵핑하고 그것을 오브젝트에 적용하는 방법을 알아보았다.
다음 TIL에서 Script를 이용해 캐릭터의 이동과 에임에 따른 방향 보기, 좌클릭 시 투사체 나가게 하기를 진행해 볼 것이다.
작성할 게 많아서 TIL작성시간도 길어졌지만, 이걸로 Unity 입력은 마스터 한 것 같다.
2024.10.08 자 TIL 마침.