Enhanced Input - Input Mapping Context - Mapping Key Dynamic Change / 향상된 입력 - Input Mapping Context - 매핑 키 동적 변경

YH J·2023년 6월 26일
0

UE5 C++

목록 보기
5/10

글의 목표

요즘 게임들은 당연하게도 설정에서 키를 변경 할 수 있다.
키 변경을 누르면 키를 입력을 기다리는 입력 대기모드가 되고, 키를 입력하면 그 키의 이름이 입력되고 입력된 키로 설정되는게 대부분이다. 이 기능은 꼭 구현하고 싶어서 찾아보면서 공부하게 되었다.
언리얼 엔진5로 넘어오면서 키 입력 시스템이 Enhanced Input System으로 바뀌면서 찾아보기 힘들어졌는데 생각보다 간단했다.
Key를 바꾸는것은 구현했으니 다음은 위젯에서 Key를 입력받아 Key를 바꾸는것을 구현하는걸 목표로 잡아야겠다.

// 추가해야 할 헤더
#include "InputMappingContext.h"

// 사용 할 객체
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
class UInputMappingContext* DefaultMappingContext;

InputMappingContext 에서 InputAction을 등록하고 키를 매핑(설정)하고 해당 Input Action이 넘겨주는 값 (bool, Axis 2D .. 등 ) 을 어떻게 활용할지 설정할 수 있다. InputMappingContext에서 키를 매핑하므로 바꿀때도 여기서 바뀌는게 맞다.

// 원하는 InputAction에 원하는 Key를 매핑하는 함수
UInputMappingContext::MapKey(const UInputAction *Action, FKey ToKey)

// 원하는 InputAction에 매핑되어 있는 모든 키를 제거하는 함수
UInputMappingContext::UnmapAllKeysFromAction(const UInputAction *Action)

이 2개의 함수를 활용하면 매핑한 키를 쉽게 변경 할 수 있다.

// 예시 함수
void ACPlayableCharacterBase::ChangeBindingAction(UInputAction* InAction, FKey InKey)
{
	DefaultMappingContext->UnmapAllKeysFromAction(InAction);
	DefaultMappingContext->MapKey(InAction, InKey);
}

InputAction과 FKey를 입력받아 일단 매핑되어 있는 키를 해제하고 입력한 키를 매핑하도록 만든 함수이다.

//FKey 생성자
FKey()

FKey(const FName InName)

FKey(const TCHAR* InName)

FKey(const ANSICHAR* InName)

FKey의 생성자에 맞춰서 InputAction과 FKey를 입력한다.

// 예시 함수를 사용하는 코드

ChangeBindingAction(JumpAction, FKey("J"));
ChangeBindingAction(JumpAction, FKey("RightMouseButton"));

//JumpAction에 J키를 할당한 뒤 RightMouseButton을 할당하는 코드이다.

처음에는 SpaceBar에 바인딩 되어 있는데, BeginPlay에서 함수를 2번 불러서 최종적으로 마우스 우클릭으로 점프를 하도록 테스트 해보았다.

Key들의 Display Name 모음

https://michaeljcole.github.io/wiki.unrealengine.com/List_of_Key/Gamepad_Input_Names/
여기서 원하는 Key의 이름을 확인하면 된다.

profile
게임 개발자 지망생

0개의 댓글