본문으로 바로가기

Unity3D) Input System

category Unity3D/기능 2021. 2. 17. 22:26

전용 에디터 또는 스크립트에서 Action을 정의하고, 이를 기기의 주요 동작 또는 마우스 왼쪽 버튼과 같이 추상적이거나 구체적인 입력에 모두 연동시킬 수 있다.

액션이 수행되면 콜백을 받아낼 수 있다.

Input System은 Unity 2019.1이상 버전에서 제공된다.

Package Manager를 통해 설치할 수 있다.

 

자세한 사항은 blogs.unity3d.com/kr/2019/10/14/introducing-the-new-input-system/ 를 보시라

 

기존의 Legacy 코드를 사용해도 되지만, Callback을 받아낼 수 있다는 점에서 조금 더 유연하게 사용가능

다중 오브젝트에 대해서 Action을 처리할 수 있다.

 

기본적으로, Package Manager - Unity Registry 에서 Input System을 설치해야 한다.

 

설치가 됐다면, 기존의 Create 처럼 폴더에서 마우스 우클릭 -> Create -> Input Actions로 액션들을 만들 수 있다.

생성한 후 더블클릭 하자

 

다음과 같은 창이 나타나게 된다.

도킹해도 되고 그냥 사용해도 되지만, 어짜피 연동후에는 잘 쓰이지 않으므로 도킹은 하지 말자

 

  • Action Maps
    - 우리가 어떻게 게임을 디자인할지는 전혀 알 수가 없으니, 우리가 직접 작성 해야 함.
    - Scene마다 Input의 방법이 달라지거나, 캐릭터마다 달라져야 할 경우
  • Actions
    - Action Maps에서 새로운 카테고리를 추가할 경우, Actions 에서 액션을 추가할 수 있다.
    - Move, Jump, Sprint, Crouch 같은 하나의 액션들을 추가한다.
    - Actions의 옆에 '+' 버튼이 있는데, 이를 클릭하여 Binding 처리할 수 있다. 
        KeyCode나, Xbos, 기타 Controller 같은 각 기기마다의 바인딩을 할 수 있다. 
  • Properties
    - Action Type : Button 같은 '딸깍' 같이 클릭 행위거나
                        Pass Through 같은 Axis, Vector3(x, y, z) 같은 정보
                        Pass Through 같은 정보는 Binding을 통하여 정보를 받아온다.

본인은 간단한 1인칭에 대한 Action Maps를 정의했다.

Binding을 통하여 처리할 것이기 때문에 Pass Through로 추가하며

이때 넘어오는 정보는 Vector2를 사용한다. 다음으로 Actions의 Move에 오른쪽 '+' 버튼을 클릭하여

'Add 2D Vector Composite'를 클릭한다. 이는 Properties 의 Action 타입이 무엇이냐에 따라 달라질 수 있다.

 

각 Composite 를 눌러보면 Properties에 정보가 출력된다.

Path를 통하여 Binding할 키를 선택할 수 있는데, 검색을 하여서 추가하거나

Listen 버튼을 누른 후 원하는 키보드를 누르면 자동으로 찾아준다.

이렇게 Up, Down, Left, Right에 각각 W, S, A, D 를 Binding 했다.

 

Binding 된 Composite 들

생성된 InputAction을 스크립트로 사용하려면, C# 파일로 생성해야한다.

만든 InputAction을 클릭하고, Inspector 창에서 Generate C# Class 를 활성화한다.

 

이곳에서 생성될 위치, 이름, 이름 공간 등을 정의할 수 있다. Apply를 누르면 기본적으로 InputAction 폴더와 같은 폴더에 생성된다.

 

생성된 InputAction.cs 파일을 이용하여, 실제 MoveController를 구현하겠다.

사용하려면 InputAction.cs 내의 인터페이스를 상속받고, 인터페이스들을 구현하여야 한다.

본인은 FirstPersonInputAction이라는 InputAction을 생성했다.

 

FirstPersonInputAction의 IFirstPersonActions를 상속받는다.

우리가 Composite들을 Binding할 때, Move라는 Action을 생성했다. 이에 맞춰서 OnMove라는 인터페이스가 생기는데,

이 인터페이스를 구현하여 CallbackContext에서 값을 받아 사용한다.

 

  • FirstPersonInputAction _inputActions : 
    InputAction들을 활성화시킬 객체.
    객체를 생성하여 Callback을 등록시키고, Enable 시켜야 실제로 Interface 로 구현한 함수내로 정보들이 넘어온다.
  • CharacterController controller :
    캐릭터(3D) 의 컨트롤러 객체.
    움직임에 쓰임
  • Vector2 inputVector : 
    Interface로 구현한 함수 내에, Context가 넘어온다. 이 Context를 형변환하여 inputVector에 저장해놓고
    이를 이동에 사용한다.

일단, 궁금증이 더 생기기 전에 Interface로 구현한 OnMove함수부터 확인해보자.

 

InputAction은 기본적으로 생성한 Action이 실제로 일어났을 때, Callback으로 값을 넘겨준다.

우리같은 경우는 Move를 2D Vector로 받기로 했다.

그러므로 Callback으로 넘어온 context에서 값을 Vector2 형태로 읽는다.

넘어오는 값들은 기본적으로 [-1, 1] 의 정규화된 값이다.

 

다음은 FirstPersonInputAction을 초기화 시키는 부분이다.

 

우리는 IFirstPersonActions를 상속하여 구현했으므로, instance로 넘길 수 있다.

Enable, Disable은 InputAction의 켜고 끔이다.

 

 

 

그리고 controller를 통해 Move를 하면 값에 따라서 이동이 일어난다.

'Unity3D > 기능' 카테고리의 다른 글

Unity3D) Firebase 연동  (0) 2021.02.18
Unity3D) Navigation - 2  (0) 2021.01.31
Unity3D) Navigation - 1  (0) 2021.01.31