요즘 게임들은 당연하게도 설정에서 키를 변경 할 수 있다.
키 변경을 누르면 키를 입력을 기다리는 입력 대기모드가 되고, 키를 입력하면 그 키의 이름이 입력되고 입력된 키로 설정되는게 대부분이다. 이 기능은 꼭 구현하고 싶어서 찾아보면서 공부하게 되었다.
언리얼 엔진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번 불러서 최종적으로 마우스 우클릭으로 점프를 하도록 테스트 해보았다.
https://michaeljcole.github.io/wiki.unrealengine.com/List_of_Key/Gamepad_Input_Names/
여기서 원하는 Key의 이름을 확인하면 된다.