[UE5] Enhanced Input
EnhancedInput?
EnhancedInput 시스템은 Unreal Engine5에 등장한 새로운 Input 시스템으로 기존 InputSystem 보다 더 나은 기능 및 확장성을 가졌다. 이 포스팅에서는 코드로 EngancedInput를 사용하는 법을 작성할 것이다.
EnhancedInput 모듈준비
EnhancedInput은 코드로 작성할 수 있다. EnhancedInput 시스템을 사용하기 전에 먼저 모듈을 추가시켜줘야 한다.
1.모듈이란
UEnhancedInputLocalPlayerSubSystem는 EnhancedInputSubsystems.h 헤더 안에 있다 이 헤더를 쓰기 위해선 모듈을 추가해줘야 한다.
2.모듈추가
모듈은 플러그인을 빌드에 포함시키게 해주는 것으로 언리얼이 모든 플러그인이 아닌 필요한 플러그인만 빌드 시키게 함으로써 성능 향상 시켜준다.
플러그인은 Engine/UE5/Plugins
안에 있는 파일들에 볼 수 있으며 프로젝트이름.Build.cs
파일에서 모듈을 관리할 수 있다.
3.빌드 및 임시파일 초기화
추가 후 CTRL+SHIFT+B로 빌드 해주면 헤더를 사용할 수 있다.
안되는 경우 컴파일시 생성되는 임시파일을 삭제해줘야 한다. 프로젝트 폴더에 가서 Binaries, Intermediate, Saved 폴더를 삭제한다.
그리고 프로젝트파일 우클릭 후 Generate Visual Studio project files를 눌러 삭제한 폴더들을 다시 만든다.
코드로 EnhancedInput 작성
1-1. MappingContext
코드로 사용하기 위해선 로컬플레이어 Input Subsystem인 UEnhancedInputLocalPlayerSubSystem이 필요하다.
void UMyPlayer::BeginPlay()
{
Super::BeginPlay();
if (APlayerController* PlayerController = Cast<APlayerController>(GetController())) {
if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem< UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer())) {
Subsystem->AddMappingContext("MAPPING CONTEXT VARIABLE", 0);
}
}
}
1-2. Component에서 사용할 시
GetControll
메타함수는 Pawn
이하 클래스에서만 사용 할 수 있다. Component는 컨트롤러를 가지고 있지 않기 때문에 Pawn의 컨트롤러를 가져와야한다.
AController* UGrabber::GetOwnerController() const {
AActor* Owner = GetOwner();
if (Owner) {
APawn* PawnOwner = Cast<APawn>(Owner);
if (PawnOwner) {
return PawnOwner->GetController();
}
}
return nullptr;
}
다만 게임설계상 컴포넌트에서 직접 하는 것 보단 컴포넌트를 관리하는 Actor에서 Input을 관리하는 것이 더 좋다.
위 과정을 BP로 할 경우 이렇게 된다.
2. InputAction 사용
이제 MappingContext
를 시스템에 적용했으니 키를 누르면 InputAction 입력 값이 나올 것이다.
InputAction의 값을 쓰고 싶으면 FInputActionValue타입 변수를 써야한다.
#include "InputActionValue.h"
void Grab(const FInputActionValue& Value);
3. 바인딩 추가
키가 입력 됬을 때 특정 함수를 실행 시키고 싶다면 EnhancedInputComponent를 사용하면 된다.
#include "EnhancedInputComponent.h"
#include "Components/InputComponent.h"
void UMyPlayer::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) {
if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent)) {
EnhancedInputComponent->BindAction(GrabAction,ETriggerEvent::Started, this, &UGrabber::Grab);
}
}
PlayerController에 의해 호출되는 APawn::SetupPlayerInputComponent함수에서 InputComponent를 EnhancedInputComponent로 캐스팅 후 키 입력시 발생할 함수를 바인딩 해준다.
만약 CastChecked가 실패할 경우 게임이 크래시되어 종료한다.
Reference
UE5 C++ Enhanced Input-2 Bind C++ Functions to Input Actions
UE5 - EnhancedInput 공식문서
댓글남기기