TIL

[TIL] Unreal Engine Enhanced Input System (C++)

think95592 2026. 6. 9. 20:37

오늘 배운 내용

오늘은 언리얼 엔진의 Enhanced Input System을 C++로 구현해보았다.

기존에는 블루프린트에서 입력 이벤트를 연결하는 방식만 사용했는데, C++로 구현하면서 입력이 실제로 어떤 흐름으로 처리되는지 이해할 수 있었다.


Enhanced Input System이란?

기존 Input System을 개선한 입력 처리 시스템이다.

단순히 키를 눌렀는지 확인하는 것을 넘어 다음과 같은 기능을 제공한다.

  • 입력 액션(Input Action)
  • 입력 매핑 컨텍스트(Input Mapping Context)
  • 트리거(Trigger)
  • 모디파이어(Modifier)

예를 들어 같은 W 키라도

  • 짧게 누르기
  • 길게 누르기
  • 두 번 누르기

등을 쉽게 구분할 수 있다.


주요 구성 요소

Input Action

플레이어가 수행할 행동을 정의한다.

예시

  • 이동(Move)
  • 점프(Jump)
  • 달리기(Sprint)
  • 카메라 회전(Look)

Input Action은 "무슨 행동을 할 것인가"를 정의하는 데이터 에셋이다.


Input Mapping Context

실제 입력 키와 액션을 연결한다.

예시

키액션

즉,

Input Action이 행동이라면

Input Mapping Context는 행동과 키를 연결하는 설정표라고 볼 수 있다.


Enhanced Input Component

입력 액션과 함수를 연결하는 역할을 한다.

 
EnhancedInputComponent->BindAction(
    JumpAction,
    ETriggerEvent::Started,
    this,
    &AMyCharacter::Jump
);
 

위 코드는

"JumpAction이 발생하면 Jump 함수를 실행해라"

라는 의미이다.


구현 과정

1. Input Mapping Context 추가

게임 시작 시 컨트롤러에서 플레이어에게 Input Mapping Context를 등록한다.

 
if (ULocalPlayer* LocalPlayer = GetLocalPlayer())
	{
		if (UEnhancedInputLocalPlayerSubsystem * SubSystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
		{
			if (InputMappingContext)
			{
				SubSystem->AddMappingContext(InputMappingContext,0);
			}
		}
	}
 

이 과정을 하지 않으면 입력이 동작하지 않는다.


2. Input Action 바인딩

SetupPlayerInputComponent에서 입력과 함수를 연결한다.

 
if (PlayerController->MoveAction)
			{
				EnhancedInput->BindAction(
                PlayerController->MoveAction,
                ETriggerEvent::Triggered,
                this,
                &ASpartaCharacter::Move
                );
			}
 

3. 입력 값 받기

 
void ASpartaCharacter::Move(const FInputActionValue& value)
{
	if (!Controller)
	{
		return;
	}
	
	const FVector2D MoveInput = value.Get<FVector2D>();
	
	if (!FMath::IsNearlyZero(MoveInput.X))
	{
		AddMovementInput(GetActorForwardVector(),MoveInput.X);
	}
	if (!FMath::IsNearlyZero(MoveInput.Y))
	{
		AddMovementInput(GetActorRightVector(),MoveInput.Y);
	}
}
 

InputActionValue를 통해 입력값을 가져온다.

이 값은 액션 종류에 따라

  • bool
  • float
  • FVector2D
  • FVector

등 다양한 형태로 받을 수 있다.


블루프린트와 C++의 차이

블루프린트에서는 이벤트 노드를 배치하면 바로 동작했다.

하지만 C++에서는

  1. Input Action 생성
  2. Mapping Context 생성
  3. Mapping Context 등록
  4. Action 바인딩
  5. 함수 구현

과정을 직접 작성해야 한다.

처음에는 번거롭게 느껴졌지만 입력이 실제로 어떻게 연결되는지 이해할 수 있었다.


오늘 느낀 점

블루프린트에서는 입력 시스템을 "사용"했다면, C++에서는 입력 시스템이 동작하는 구조를 직접 다루게 된다는 점이 가장 큰 차이였다.

특히 Input Action → Mapping Context → BindAction으로 이어지는 흐름을 이해하니 Enhanced Input System의 구조가 훨씬 명확하게 보였다.

앞으로는 단순히 입력 기능을 구현하는 것을 넘어 트리거와 모디파이어를 활용하여 더 다양한 입력 처리 방식도 구현해보고 싶다.


한 줄 정리

Enhanced Input System은 "행동(Input Action)"과 "입력 키(Input Mapping Context)"를 분리하여 관리하는 입력 시스템이며, C++에서는 이를 직접 등록하고 바인딩하면서 입력 처리 구조를 더 깊이 이해할 수 있었다.