Enhanced Input System은 언리얼 엔진에서 기존 입력 시스템을 대체하는 새롭게 확장된 입력 처리 시스템이다. 입력을 다양한 플랫폼에서 쉽게 관리할 수 있도록 설계되었다.
입력 맵핑(Context) 기반 구조
Input Action
Input Action으로 정의한다. 플랫폼 독립성
IA_MoveIA_JumpIA_LookIA_SprintAxis2D (이동을 위한 2D 입력)Digital(bool) (점프와 같이 단순 On/Off 입력)Axis2D (카메라 회전을 위한 2D 입력)Digital(bool) (달리기와 같이 단순 On/Off 입력)Pressed : 키보드 입력을 처음 눌렀을 때Released : 키보드 입력을 뗐을 때Hold : 계속 누르고 있을 때Scale : 입력 값에 곱셈 스케일을 적용Invert : 입력 축 값을 반전Dead Zone : 작은 입력 값(예: 게임패드 스틱의 미세 움직임)을 무시Mappings에 Input Actions를 추가해서 매핑시킨다:IA_MoveIA_JumpIA_LookIA_SprintIA_MoveW :Swizzle Input Axis Values : XZY로 설정W는 전진(X축) 입력으로 동작한다.S : Swizzle Input Axis Values : XZY로 설정Negate : X, Y, Z 모두 체크A : Swizzle Input Axis Values : YXZ로 설정Negate -> X, Y, Z 모두 체크D : Swizzle Input Axis Values : YXZ로 설정IA_JumpSpace Bar : IA_LookMouse XY 2D-Axis : Negate : Y만 체크IA_SprintLeft Shift : #pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "SpartaPlayerController.generated.h"
class UInputMappingContext;
class UInputAction;
UCLASS()
class CH3CPP_API ASpartaPlayerController : public APlayerController
{
GENERATED_BODY()
public:
ASpartaPlayerController();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputMappingContext* InputMappingContext;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* MoveAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* JumpAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* LookAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* SprintAction;
};
#include "SpartaPlayerController.h"
ASpartaPlayerController::ASpartaPlayerController()
: InputMappingContext(nullptr),
MoveAction(nullptr),
JumpAction(nullptr),
LookAction(nullptr),
SprintAction(nullptr)
{
}
InputMappingContext와 각 InputAction을 에디터에서 연결한다:
InputMappingContext: PlayerInputMappingMoveAction: IA_MoveJumpAction: IA_JumpLookAction: IA_LookSprintAction: IA_Sprint#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "SpartaPlayerController.generated.h"
class UInputMappingContext;
class UInputAction;
UCLASS()
class CH3CPP_API ASpartaPlayerController : public APlayerController
{
GENERATED_BODY()
public:
ASpartaPlayerController();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputMappingContext* InputMappingContext;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* MoveAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* JumpAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* LookAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* SprintAction;
protected:
virtual void BeginPlay() override;
};
#include "SpartaPlayerController.h"
#include "EnhancedInputSubsystems.h"
ASpartaPlayerController::ASpartaPlayerController()
: InputMappingContext(nullptr),
MoveAction(nullptr),
JumpAction(nullptr),
LookAction(nullptr),
SprintAction(nullptr)
{
}
void ASpartaPlayerController::BeginPlay()
{
Super::BeginPlay();
if (ULocalPlayer* LocalPlayer = GetLocalPlayer())
{
if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
{
if (InputMappingContext)
{
Subsystem->AddMappingContext(InputMappingContext, 0);
}
}
}
}
(1) LocalPlayer 가져오기
if (ULocalPlayer* LocalPlayer = GetLocalPlayer())
(2) Enhanced Input Subsystem 가져오기
if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
(3) Input Mapping Context 추가
Subsystem->AddMappingContext(InputMappingContext, 0);
AddMappingContextInputMappingContext: 추가할 Input Mapping Context 0 (Priority): 우선순위 값. 낮은 값일수록 높은 우선순위를 가진다.