본문 바로가기
공부/Unreal Engine 5

[언리얼5] 액션&축 매핑 향상된입력(Enhanced Input)으로 변경하기(feat. C++)

by MY블로그 2024. 1. 12.

언리얼4까지는 Action Mapping & Axis Mapping (액션 & 축 매핑)으로 플레이어의 입력값을 받아 동작을 진행하였습니다.

하지만 언리얼 5에서부터는 향상된입력기능이 적용 가능하므로 그에 맞추어 기존의 입력 방식을 변경해 보려 합니다.

 

1. 기존의 입력 방식

엔진의 프로젝트 세팅 > 엔진(입력) 메뉴에서 매핑 매뉴를 설정하고 C++ 코드에서 함수와 바인딩하여 사용 하였습니다.

좌 : 언리얼 엔진의 프로젝트 세팅창 / 우 : C++로 구현된 바인딩 코드

2. 플러그인 설치 확인하기

언리얼 엔진의 [편집] 메뉴에서 [플러그인]창을 통하여 필요한 플러그인이 체크 되어있는지 확인하도록 합니다.

언리얼 5.3버전은 설치시부터 적용이 되어있으나 그이하의 버전은 적용이 되어있지 않을수도 있습니다.

 

3. 모듈 추가하기

비주얼스튜디오 솔루션 탐색기의 해당 프로젝트의 프로젝트이름.Build.cs 파일에서 모듈을 추가하도록 합니다.

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "GeometryCollectionEngine", "Niagara", "UMG", "AIModule", "EnhancedInput" });

 

PublicDependencyModuleNames.AddRange(new string[] { })의 중괄호 안쪽에 다른 모듈처럼 "EnhancedInput" 을 추가해 주도록 합니다. 모듈사이에 따옴표도 동일하게 적어야합니다.

 

모듈이 새로 추가될 경우 단순히 텍스트 추가만으로 완료되지 않기 때문에 엔진과 비주얼 스튜디오를 종료한 후 프로젝트를 재생성 해주도록 합니다.(프로그램 종료시 꼭 저장하도록 합니다)

 

프로젝트를 재생성 하기 위해서는 기존에 있던 폴더를 지워야 합니다.

프로젝트폴더 내부의 Binaries / Intermediate / Saved 3개의 폴더 입니다.

폴더를 삭제한후 엔진실행파일 우클릭 > Generate Visual Studio project files 를 실행합니다.

실행시 Intermediate / Saved  폴더가 생성됩니다.

이후 프로젝트의 언리얼엔진을 실행시키면 알림창이 뜨게되는데 그대로 리빌드 하면 됩니다.

리빌드시 Binaries  폴더가 생성됩니다.

이후 해당프로젝트의 비주얼스튜디오 솔루션파일과 엔진이 실행되면 모듈추가가 완료된 것입니다.

 

4. 입력 액션 생성하기

컨텐츠 브라우저 창을 통하여 플레이어의 입력 액션을 생성해 주도록 합니다.

우클릭 > 입력(Input) > 입력 액션(Input Action)

우선 캐릭터의 이동을 구현할 것이기 때문에 Movement를 만들도록 합니다. 

생성후 값의 타입을 전,후,좌,우 평면상의 움직임을 구현할 것이므로 Axis2D(Vector2D)로 설정합니다.

 

5. 인풋 매핑 컨텍스트(IMC) 생성

컨텐츠 브라우저 우클릭 > 입력 > 입력 매핑 컨텍스트 생성

입력 매핑 컨텍스트(략IMC)는 생성한 입력 액션(략 IA)을 추가하여 관리합니다.

생성한 IMC 를 실행하고 IA를 추가하도록 합니다.

IA를 매핑에 적용한후 입력에 따른 설정을 진행합니다.

우선 WSAD(전후좌우) 이동 키를 사용한다는 가정하에 더해지는 값이 양수(좌표상 앞으로이동과 우측이동)의 키입력 설정을 해주고 이후 음수(좌표상 뒤로이동과 좌측이동)의 키입력 설정을 해주도록 합니다.

IA 우측의 + 버튼을 활용하여 키입력을 추가하고 추가한 키입력의 키값들을 넣어줍니다.

우측이동 D는 키입력만 설정 이후 좌측이동 A는 키입력 설정후 모디파이어에 1개의 배열을 추가한후 해당 배열을 부정(Negate)로 설정합니다.

이렇게 설정할 경우 D키를 입력시 +1의 값이 전달될때 A는 이와 반대(부정)하는 -1의 값을 전달합니다.

이렇게 부정을 사용하기위하여 양수의 키값을 설정후 그것을 부정하는 것으로 반대되는 키값을 설정합니다.

 

전후이동 입력의경우 각각의 추가적인 모디파이어가 필요합니다.

모디파이어를 추가한후 스위즐 입력 축값으로 설정합니다. 정렬은 YXZ 입니다.

언리얼 엔진의 좌표 체계상 앞으로 이동이 Y값이기 때문에 Y값을 먼저 적용하는 YXZ가 적용됩니다.

 

뒤로이동은 이와반대(부정)을 추가적으로 적용합니다.

 

6. C++연결하기

향상된 입력을 C++에서 적용하기 위해서 변수를 생성합니다.

작업전 전방선언으로 클래스를 선언합니다.

클래스의 상단에 전방선언해도 괜찮고 변수를 생성할때 클래스를 선언해도 괜찮습니다.

사용할 클래스의 헤더에 프로퍼티와 변수를 선언합니다.

C++코드에서 선언후 엔진(BP)에서 직접 값을 적용하려 합니다.

향상된 입력을 사용할 클래스의 CPP에 필요한 헤더들도 선언하도록 합니다.

이후 게임이 실행될때 한번 동작하는 함수 BeginPlay함수에서 컨텍스트 추가 코드를 작성합니다.

임시변수를 사용하여 필요한 값이 있는지 없는지를 판단할 수 있도록 작성하면 좋습니다.

 

7. 실행 함수 구현

이후 실질적으로 움직일 수 있는 함수를 만들어 선언하도록 합니다.

해당 함수의 매개변수 값으로 들어오는 자료형은 해당 클래스의 헤더에 추가선언 해야 사용이 가능합니다.

함수 작성전 기존에 적용되어있는 바인딩 함수는 사용하지 않을 것이므로 주석처리 후 새롭게 향상된 입력으로 함수를 바인딩 합니다.

 

Move 함수의 기능은 개인의 프로젝트마다 다르게 구현될 것입니다.

플레이어가 이동하는 방향으로 회전이 적용될경우는 아래처럼 적용합니다.

 

추가 작업 : 마우스 이동에따른 시야 회전

 

이동처럼 IA를 생성하여 값 타입을 Axis2D 로 지정후 IMC에서 입력키를 마우스 XY 2D 축으로 지정합니다.

모디파이어 배열추가 > 부정 > X,Z축 체크 해제시 Y축만 반전된값이 적용됩니다.

일반적인 게임에서 Y 마우스가 위로올라갈때 화면의 각도는 아래로 이동하는 경우 Y축만 반전 시키면 됩니다.

이후 C++ 헤더에서 이동처럼 변수를 선언하고 바인딩 합니다.

클래스의 헤더에서 변수선언, CPP에서 바인딩

바인딩된 실행함수를 정의하도록 합니다.

간단히 마우스의 좌표가 상하좌우의 변화에따라 시야 회전 각도를 변화 시키는 코드 입니다.

 

8. 축매핑에서 향상된 입력으로 플레이어 캐릭터에 적용하기

C++에서 변수를 선언하고 블루프린트에서 직접 값을 넣어 주어야 사용할 수 있기 때문에 플레이어캐릭터의 블루프린트에서 값을 적용 시켜주도록 합니다.

 

오류인지 모르겠으나 카테고리를 Input 으로 영문 설정하였습니다. 엔진자체의 번역으로 인하여 한글 검색으로 카테고리가 나뉘는 것을 확인하였습니다.

 

만일 해당 변수들이 노출되지 않는다면 비주얼 스튜디오에서 컴파일 하지 않았을 경우 일듯 합니다. 엔진을 종료후 컴파일 하여 다시 실행하면 노출 됩니다.

 

기존과 동일한 움직임이 실행 확인!

 

 

9. 액션매핑에서 향상된 입력으로 

점프

우선 가장 기본적인 점프에대한 액션매핑을 향상된 입력으로 적용 해보도록합니다.

똑같이 IA를 생성하지만 추가적으로 설정할 것은 없습니다. 값타입을 Digital(bool)로 그대로 두도록 합니다.

키가 입력될경우(트리거)에 한번 작동할 것이기 때문입니다.

점프기능은 ACharacter 클래스에서 구현된 점프를 오버라이드하여 사용하기떄문에 매우 간결합니다.

다른 IA처럼 변수를 헤더에서 선언하고, CPP에서 함수와 바인딩해주면 완료입니다.

좌 : 플레이어클래스의 헤더 / 우 : 플레이어 클래스의 CPP

이후 IMC에서 IA를 추가한뒤 키입력을 설정하고, 플레이어캐릭터의 블루프린트에서도 변수에 IA를 추가합니다.

 

IA 점프 테스트 기존과 동일하게 실행

이외에도 미리 구현된 다른 액션들도 바인딩 해보도록 합니다. (상호작용, 공격, 회피)

기존의 입력 방식과 향상된 입력 방식의 두개의 바인딩 차리를 확인합니다.

좌: 기존의 바인딩 방식 / 우 : 향상된 입력의 바인딩

최종적으로 플레이어 캐릭터의 블루프린트에서 변수에 값을 넣어 주고 확인합니다.

 

최종확인시 디버그를 통하여 향상된 입력을 확인 할 수 있습니다.

플레이 > [ ~ ] 키누르기 > ShowDebug Enhancedinput 입력

최종확인

최종적으로 디버그를 통하여 확인하였을때 키를 누르고 있는동안은 계속해서 트리거 되는 모습을 볼 수 있습니다.

만일 아이템을 획득할경우 입력키와 사용키를 같은 키로 사용할 경우 입수하자마자 사용될 수 있습니다.

 

프로젝트에서 무기와 오버랩되어있을때 E키를통하여 입수하는 것이 가능하지만 입수하자마자 장착이아닌 한번더 트리거되어 장착을 해제 하는 것이 되어버렸습니다.

 

매프레임 트리거 되는 것을 방지하기위해서는 추가적인 설정이 필요합니다.

IMC에서 IA의 실행키를 설정하는 메뉴에서 트리거에 엘리먼트를 추가합니다.

해당 엘리먼트를 펄스로 지정후 간격시간을 설정해 준다면 해당 한번 실행한뒤 해당 간격의 시간뒤에 다시 트리거시킬 수 있게됩니다.

댓글