본문 바로가기
프로그래밍/Unreal Engine

[UE] 언리얼 엔진 - 향상된 입력 (Enhanced Input)

by Sik.K 2023. 11. 26.

언리얼 엔진 5.1부터 추가된 기능인 향상된 입력은 기존의 축, 액션 맵핑을 대체하는 입력 기능이다.

 

기존의 입력 체계와는 완전히 역호환 되므로 5.1 버전 이후로는 Enhanced Input을 사용하기를 권장한다.

 

향상된 입력

 

향상된 입력은 5.2 버전이라면 플러그인이 기본으로 설치되어 있지만 5.1 버전의 경우 새롭게 플러그인을 설치해줘야 한다.

 

구성은 입력 액션과 입력 맵핑 컨텍스트로 나눠져 있는데 입력 액션은 실제로 입력을 받았을 때 그 값을 어떻게 처리할 건지에 대한 설정이다.

 

입력 액션 내부로 들어가면 다음과 같은 창이 나온다.

 

입력 액션 창

 

입력 액션에는 아직 키가 바인딩 되어 있지 않다. 단순히 입력 받은 키값에 대한 값을 프로젝트에서 어떻게 인식할 것인지에 대한 설정을 하는 것이 기본이다.

 

이런 입력 액션들을 실제로 키값에 바인딩 해주는 부분이 바로 입력 맵핑 컨텍스트로 각 액션에 대해 어떤 키값을 바인딩 할 것인지 정해줄 수 있다.

 

입력 맵핑 컨텍스트 창

 

 

크게 알아야 하는 개념은 값 타입과 Triggers, Modifiers인데, 값 타입은 컨트롤러 혹은 폰에서 입력 받은 값을 어떤 식으로 인식할 것인지에 대한 구분인데 기본은 Bool 값으로 되어 있다.

 

  • Digital - 일반적인 Boolen 값
  • Axis1D - float 값
  • Axis2D - FVector2D의 값
  • Axis3D - FVector의 값

여기서 정해진 값을 통해 우리는 C++나 블루프린트에서 해당 값을 받아와 사용할 수 있다. 예를 들어 현재 IA_Move 입력 액션에 WASD 키가 바인딩 되어 있는데, 이 값을 Axis2D로 설정하겠다고 앞서 입력 액션에서 정해주었다.

 

입력 축값을 사용하여 읽어올 때 그 순서는 YXZ 순이고 우리는 이 값을 이차원 벡터로 받아오기 때문에 나중에 FVector2D를 이용해 값을 사용하면 된다.

 

그러면 이 값을 C++에서 바인딩 해보겠다.

 

AC_Knight의 멤버 변수

 

캐릭터 클래스가 가지고 있는 입력 맵핑 컨텍스트 변수와 각각 사용할 입력 액션 변수들이다. 단순히 선언한다고 바로 인식하는 것이 아니라 두 변수를 가져올 수 있는 모듈인 "EnhancedInput"을 먼저 Build.cs에 입력해야 한다.

 

Buils.cs 내부

 

이렇게 모듈을 성공적으로 입력하게 되면 두 변수들을 모두 사용할 수 있게 되는데 생성될 때 바인딩하는 법은 아래와 같다.

 

C++에서 입력 맵핑 컨텍스트 바인딩

 

C++에서 입력 액션 바인딩

 

또한 방금 생성한 입력 맵핑 컨텍스트가 이 캐릭터가 가진 컨트롤러에서 사용할 컨텍스트라는 것을 알려주기 위해 BeginPlay() 함수에서 컨트롤러에 컨텍스트를 추가해준다.

 

 

입력 맵핑 컨텍스트를 플레이어 컨트롤러에 추가

 

 

컨텍스트를 먼저 생성하고, 그 다음 각 입력 액션을 바인딩 해주면 준비는 끝난다. 이후에 ACharacter 클래스에서 상속 받은 SetupPlayerInputComponent() 함수에서 각 입력 액션과 실행할 함수를 바인딩 해주면 끝난다.

 

 

입력 액션과 함수 바인딩

 

인풋 컴포넌트를 향상된 입력 컴포넌트로 형변환하여 BindAction() 함수를 실행하면 되는데, 기본적인 매개변수는 다음과 같다.

 

UEnhancedInputComponent::BindAction()

 

바인딩 할 입력 액션, 트리거 이벤트 타입, 유저 클래스 오브젝트 주소, 이 액션에 바인딩 될 함수가 기본 매개변수이다. 이렇게 하면 입력 맵핑 컨텍스트에서 바인딩 해놓은 키를 입력하면 해당 입력 액션이 연결된 함수가 실행된다.

 

 

향상된 입력 시스템

 

 

이제 실제로 함수가 실행되는 것을 확인할 텐데, 우선 필요한 것이 있다. 우리가 입력 받은 값을 가져와야 하는데 이 구조체는 FInputActionValue라는 구조체를 사용한다.

 

이 구조체를 사용하기 위해선 우선 헤더에 #include "InputActionValue.h" 구문을 추가하여 인클루드를 먼저 해줘야한다. 이 구문 역시 모듈 EnhancedInput이 필요하다.

 

성공적으로 구조체를 인식했다면 함수를 작성해주자. 나는 움직임에 필요한 Move() 함수와 공격에 필요한 Attack() 함수를 만들었다.

 

행동 함수

 

 

Move() 함수 정의
Attack() 함수 정의

 

입력 액션에서 나는 읽어온 값을 어떻게 저장할 것인지 정해뒀기 때문에, Get<Type>()을 이용해 알맞은 값으로 읽어와 사용하면 된다.

 

Attack() 함수는 단순 Boolen형의 값이기 때문에 읽어와서 조건문을 통해 공격을 실행하면 되지만 Move() 함수는 FVector2D로 읽어오기로 되어 있어 그 값을 알맞게 사용해야 한다.

 

Move() 함수 내부 FVector2D 사용 예시

 

이렇게 읽어온 값을 사용하는데, 나는 값을 YXZ의 순서로 읽어오기로 했고, S와 A를 입력하면 값을 반전시켜 주기로 해두었다.

 

IA_Move의 바인딩 속성

 

 

때문에 W는 Y의 1, S는 Y의 -1로 읽어오며 A와 D도 각각 X의 -1과 1로 읽어오게 된다. 이 값을 이용해 방향을 정할 수 있어 그대로 무브먼트 컴포넌트에서 이동 함수를 실행하면 캐릭터가 내 입력에 맞게 움직이게 된다.

 


 

 

향상된 입력을 사용한 캐릭터 입력 구현

 

 

 

 

 

 

댓글