Unreal Engine, Input Config 이해

💡
언리얼 에디터를 Lyra 소스코드 기반으로 사용하고 있다.

Lyra 공용 폴더의 InputData_SimplePawn은 어떻게 구성되어있는지 확인하고 이해해보도록 한다.

해당 파일은 Lyra의 All > Content > Input 폴더에 확인할 수 있다.

  • Native Input Actions: 조이스틱, 키보드 입력을 받으면 이동과 관련된 출력을 매핑을 담당하고 있다.
  • Ability Input Actions: 특정키 입력을 받으면 점프, 스킬 출력을 매핑을 담당하고 있다.

Native, Ability Input Actions 배열 객체

  • Index[0] 배열의 형태로 나열되어있고 참조된 곳으로 확인하면 Input Action, Input Tag 가 있음을 확인할 수 있다.

Input Tag ?

Index 참조된 곳에서 독특하게 Input Tag 를 추가하여 Enumerate 역할을 담당하고 Input Action과 매핑하는 관계로 보여지고 있다.

  • Input Tag: 키보드 또는 조이스틱 입력에 대한 매핑들을 미리 할당하고 Tag 로 불려 올 수 있도록 하고 잇따. InpuTag 객체 접근으로 Move 로 되어있는 것을 볼 수 있는데(InputTag.Move). 사전에 이동과 관련된 키보드를 미리 할당하고 유저가 Tag와 관련된 입력을 받으면 Input Action 을 실행되도록 하고 있음을 볼 수 있다.
  • Input Action: 유저가 Input Tag 관련된 키를 눌렀을 때 미리 정의한 Action을 실행할 수 있도록 해주고 있다. Action은 대표적으로 캐릭터 이동, 화면 이동, 점프, 자동 이동, 홀드 웨폰파이어 등이 있다.
  • 캡처본과 Lyra에서 다양한 Actions 만들어져 있는 것을 볼 수 있다.

Unreal Engine 4 Input 설정하기

  • UE4 에서는 Project Settings 에서 Engine - Input 항목에서 설정할 수 있었다.
  • 캡처본과 같이 Action Mappings 액션을 Forward 라는 전진하는 동작에 키보드 w 또는 마우스 좌클릭으로 이동할 수 있게 매핑할 수 있다.
  • UE5 에서는 Input 은 Deprecated 되었으 Enhanced Input 설정하는 것을권장하고 있다.

Enhanced Input 설정하기

Unreal Engine 의 Input 기능을 향상된 Input 기능이다.

만드는 방법은 Content Drawer 탐색기에서 먼저 All > Content > Input > Actions 으로 이동한다.

  • +ADD 클릭하여 Input > Input Action 에셋을 추가하도록 한다.
  • 이름은 "IA_Heal" 으로 지어주도록 하였다.
  • 해당 에셋을 더블클릭
  • 해당 Input 에셋은 특정 행동을 진행할 때 반환되어야 하는 것을 정할 수 있다.
  • 반환할 수 있는 항목 여러개 옵션을 설정할 수 있다. 많이 사용하는 Value Type 부터 설정을 진행하도록 한다.
  • Triggers, Modifiers, Advanced 는 위에 있는 Value Type 조건을 걸 수 있다.
    예를 들면 버튼을 살짝뗀다 > 무시한다 라는 기능이 필요할 때, Modefiers 배열 생성 후 DeadZone, 0.2, 1.0 설정하면 0.2~1.0 float 타입만 받을 수 있다.

Enhanced Input, Value Type

해당 객체 옵션을 4개 선택 가능하다.

  • Digital(bool) : true, false 만 설정가능, 예로)버튼을 누르고 있는 상태(Hold)는 True 반환, 버튼을 뗀 상태이면 False를 반환한다.
  • Axis1D(float) : 조이스틱에서 스틱을 앞 뒤로 행동시 float 타입이 반환하게 한다. 주로 가속도 용도로 사용한다.
  • Axis2D(Vector2D): 조이스틱에서 스틱을 앞, 뒤, 옆 행동 시 vector2D 타입 반환한다. X, Y 축을 반환받고 싶을 때 사용한다.
  • Axis3D(Vector): 조이스틱에서 스틱을 앞, 뒤, 옆 행동 시 vector 타입으로 반환한다. X, Y, Z 축을 반환받고 싶을 때 사용한다.

Enhanced Input, Context 설정하기

  • Content Drawer 탐색기의 All > Content > Input > Mappings 폴더로 이동한다.
  • +ADD 로 살펴보면 Input > Input Mapping Context 추가할 수 있다.
  • 여기에서는 새로 추가보다는 탐색하는 용도로 미리 만들어진 IMC_Default 를 살펴보도록 한다.

Enhanced Input, IMC_Default 탐색하기

해당 IMC_Default 를 더블 클릭하면 다음과 같이 정의된 모습을 볼 수 있다.
실제 IMC 를 만들때 종류별로 만들게 되는데, 본인은 IMC_Main Menu, IMC_Store, IMC_ESC 각각 나눠서 매핑하고 필요할 때만 불려온다.

  • Input Mapping Context 가장 큰 특징으로 Input 에셋을 설정하고 실제 키를 할당하는 모습을 볼 수 있다.

Enhanced Input, 이동하는 IA_Move 살펴보기

IMC_Default 에 살펴보면 IA_Move 구현된 모습을 볼 수 있다.
해당 캐릭터 이동에 대한 동작임을 확인할 수 있는데. Modifiers 반환 값을 변경해서 구현하고 있다.

Modifiers 어떻게 구현되어있는지 살펴보기 전, 캐릭터 이동하는데 X, Y축이 어떻게 이루어져야 하는지 알아보도록 한다.

y
│
│
└─── x
0

캐릭터 이동 시 반환되어야 하는 X, Y 축은?

  • 캐릭터 전면 이동은 W 를 누를 경우 0, 1 반환을 해주어야 이동한다.
  • 캐릭터 전면 이동은 A 를 누를 경우 -1, 0 반환을 해주어야 이동한다.
  • 캐릭터 전면 이동은 S 를 누를 경우 0, -1 반환을 해주어야 이동한다.
  • 캐릭터 전면 이동은 D 를 누를 경우 1, 0 반환을 해주어야 이동한다.

이제 언리얼 엔진에서 어떻게 Modifiers 를 설정하였는지 살펴보도록 한다.

W 키 전면 이동

  • IA_Move 는 기본적으로 1, 0 축을 반환한다. (Z축 무시)
  • Swizzle Input Axis Values: Order > YXZ 축으로 변경한 것을 볼 수 있다. 이것은 X,Y축을 반전하여 0, 1 축으로 반환한다.

A 키 좌측 이동

  • IA_Move 는 기본적으로 1, 0 축을 반환한다. (Z축 무시)
  • Negate: X, Y, Z 축을 음수로 반환하여 -1, 0 축으로 반환한다.

S 키 뒤로 이동

  • IA_Move 는 기본적으로 1, 0 축을 반환한다. (Z축 무시)
  • Negate: X, Y, Z 축을 음수로 반환하여 -1, 0 축으로 반환한다.
  • Swizzle Input Axis Values: Order > YXZ 축으로 변경한 것을 볼 수 있다. 이것은 X, Y축을 반전하여 0, -1 축으로 반환한다.

D 키 우측 이동

  • IA_Move 는 기본적으로 1, 0 축을 반환한다. (Z축 무시)

이제 IA_Move 사용한 경우 어떻게 값을 반환하는지 확인할 수 있다. 그리고 캐릭터 이동 처리하는 코드도 필요하니 새로 작성해야 하는 상황이 생길 수 있다.

Lyra에서는 C++ 로 이미 작성되어 있기 때문에 만약 개발자가 직접 만들어야하는 상황이라면 Blueprint 로 구성을 해보도록 한다.

  • 해당 Level 에서 Blueprint 작성하는 부분을 열어본다.
  • Enhanced Action Events 항목에서 IA_Move Context 를 추가도록 한다.
  • IA_Move 에 대한 이벤트 PIN 들을 모두 펼쳐보도록 한다.
  • IA_Move 이벤트가 발생하여 Action Value X, Action Value Y 값을 반환할 때 캐릭터 이동, Pawn Class에 대한 처리 및 바인딩을 해주어야 한다.
  • PIN 에 대한 처리는 하드코딩로 이루어질 수 있어서, 예제는 여기서 마무리 하도록 한다.

위에서 얘기한 캐릭터 이동 처리는 Lyra 에서 Gameplay Tags 프로젝트 세팅을 하지 않고 InputTag 태그 C++로 만들어 캐릭터 이동에 대한 처리 구현된 것을 확인할 수 있는데, 다형성으로 되어 있어서 권장하는 형태의 코드이다.