오늘 배운 내용
오늘은 언리얼 엔진의 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++에서는
- Input Action 생성
- Mapping Context 생성
- Mapping Context 등록
- Action 바인딩
- 함수 구현
과정을 직접 작성해야 한다.
처음에는 번거롭게 느껴졌지만 입력이 실제로 어떻게 연결되는지 이해할 수 있었다.
오늘 느낀 점
블루프린트에서는 입력 시스템을 "사용"했다면, C++에서는 입력 시스템이 동작하는 구조를 직접 다루게 된다는 점이 가장 큰 차이였다.
특히 Input Action → Mapping Context → BindAction으로 이어지는 흐름을 이해하니 Enhanced Input System의 구조가 훨씬 명확하게 보였다.
앞으로는 단순히 입력 기능을 구현하는 것을 넘어 트리거와 모디파이어를 활용하여 더 다양한 입력 처리 방식도 구현해보고 싶다.
한 줄 정리
Enhanced Input System은 "행동(Input Action)"과 "입력 키(Input Mapping Context)"를 분리하여 관리하는 입력 시스템이며, C++에서는 이를 직접 등록하고 바인딩하면서 입력 처리 구조를 더 깊이 이해할 수 있었다.
'TIL' 카테고리의 다른 글
| [TIL] C++ 정렬, 람다 함수, override, TEXT() (0) | 2026.06.11 |
|---|---|
| [TIL] - 언리얼 C++ Pawn, Enhanced Input, 비행체 구현 (0) | 2026.06.10 |
| Codex와 Unreal Engine MCP 연결 (0) | 2026.06.08 |
| [UE5] 언리얼 C++기초 정리 (0) | 2026.06.05 |
| [UE5] 언리얼 C++ 첫걸음: Visual Studio에서 Rider로 IDE 전환 및 트러블슈팅 총정리 (0) | 2026.06.04 |