
언리얼에는 기존의 액션 및 축을 매핑하는 방식의 입력을 확장한 향상된 입력 시스템이라는 플러그인이 존재합니다.
👓 기존 방식(UE4)
- 키보드/마우스 입력을 직접 바인딩
- 복잡한 입력 조합 처리가 어려움
- 런타임에 키 변경이 제한적

향상된 입력은 디폴트로 활성화되어 있으며, 콘텐츠 브라우저에서 위와 같은 방식으로 추가 가능합니다.
향상된 입력 시스템은 입력 액션(Input Actions) , 입력 매핑 컨텍스트(Input Mapping Contexts) , 입력 모디파이어(Input Modifiers) , 그리고 입력 트리거(Input Triggers) 이렇게 4가지 주요 콘셉트로 이루어져 있습니다.
입력 액션은 데이터 에셋이라는 점만 다를 뿐, 액션 및 축(Axis) 매핑 이름과 개념적으로 같습니다.
각 입력 액션은 공격, 점프, 웅크리기 같은 사용자가 할 수 있는 행동을 나타냅니다.
입력 액션의 상태가 변경될 때 블루프린트 또는 C++에 입력 리스너(Input Listeners) 를 추가할 수 있습니다.
📖 입력 리스너(Input Listeners)
입력 리스너(Input Listeners) 는 입력 액션의 상태 변화를 "감지하고 반응하는 함수"// 입력 리스너 등록 InputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &AMyCharacter::StartJump); InputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &AMyCharacter::StopJump); // 실제 반응 함수들 void AMyCharacter::StartJump() { // 점프 시작 로직 } void AMyCharacter::StopJump() { // 점프 종료 로직 }

또한 입력 액션은 여러 타입을 가질 수 있으며, 타입에 따라 액션의 동작이 결정됩니다.
기본적으로 bool 타입을 가지며 복잡한 3D축도 만들 수 있습니다.
Digital (bool) - 켜짐/꺼짐
Axis1D (float) - 1차원 값
Axis2D (Vector2D) - 2차원 값
Axis3D (Vector) - 3차원 값
👾
IA_Jump: 점프 → Digital (bool)
IA_Move: 이동 → Axis2D (Vector2D)
IA_Look_Mouse: 마우스 시점 → Axis2D (Vector2D)
.IA_Crouch: 웅크리기 → Digital (bool)
트리거 스테이트(Trigger State) 는 액션의 현재 상태를 나타냅니다.
->( 보통 Triggered 상태를 자주 사용합니다.)
C++과 블루프린트 모두 특정 스테이트에 바인딩 가능합니다.
아래는 트리거 스테이트의 종류입니다.
블루 프린트에서 입력 리스너를 추가할 수도 있지만 C++로도 입력 액션을 바인딩할 수 있습니다.
void AFooBar::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
UEnhancedInputComponent* Input = Cast<UEnhancedInputComponent>(PlayerInputComponent);
// 여기에서 'ETriggerEvent' 열거형 값을 변경하여 원하는 트리거 이벤트를 바인딩할 수 있습니다.
Input->BindAction(AimingInputAction, ETriggerEvent::Triggered, this, &AFooBar::SomeCallbackFunc);
}
void AFooBar::SomeCallbackFunc(const FInputActionInstance& Instance)
{
// 여기에서 원하는 타입의 입력 액션 값을 가져옵니다...
FVector VectorValue = Instance.GetValue().Get<FVector>();
FVector2D 2DAxisValue = Instance.GetValue().Get<FVector2D>();
float FloatValue = Instance.GetValue().Get<float>();
bool BoolValue = Instance.GetValue().Get<bool>();
// 여기서 멋진 작업을 수행하세요!
}
입력 매핑 컨텍스트 는 플레이어가 처할 수 있는 특정 컨텍스트를 나타내는 입력 액션 컬렉션으로, 주어진 입력 액션의 트리거 규칙을 설명합니다.
각 사용자에게 매핑 컨텍스트를 동적으로 추가하거나 제거하거나 우선순위를 지정할 수 있습니다.

입력 매핑 컨텍스트에서 각 입력 액션들을 키, 버튼, 이동 축같은 사용자 입력 목록으로 트리거할 수 있도록 매핑 가능합니다.

기본적으로 입력 매핑 컨텍스트는 최상위 레벨에 입력 액션 목록이 있는 계층구조이며,
입력 액션 - 사용자 입력 목록 - 입력 트리거, 입력 모디파이어 순으로 이루어져 있습니다.
향상된 입력 로컬 플레이어 서브시스템(Enhanced Input Local Player Subsystem) 을 통해 이런 입력 매핑 컨텍스트를 하나 이상의 로컬 플레이어에게 적용 가능합니다. 또한 컨텍스트의 우선순위를 지정하여 같은 입력을 사용하려는 여러 액션 간의 충돌을 해결 가능합니다.
💡 최적화
- IMC_OnFoot (도보 컨텍스트)
IA_Move → WASD키 IA_Jump → Space키 IA_Interact → E키
- IMC_Swimming (수영 컨텍스트)
IA_Move → WASD키 (물속에서 이동) IA_Dive → Shift키 (잠수) IA_Surface → Space키 (수면으로)이런 상황에서 물 안에 들어갔을 때 아래와 같이 컨텍스트를 지정하면 메모리와 CPU를 절약할 수 있습니다..
RemoveMappingContext(OnFootContext); // 도보 제거 AddMappingContext(SwimmingContext, 1); // 수영 추가
입력 모디파이어 는 입력 트리거로 보내기 전에 언리얼 에디터에서 받는 원시 입력 값을 변경하는 프리 프로세서입니다.

위의 모디파이어를 선택해서 지정 가능합니다.
1. Dead Zone (데드존)
2. Negate (반전)
3. Swizzle Input Axis Values (축 순서 변경)
4. Scalar (스케일링)
5. Smooth (스무딩)
6. Response Curve - Exponential (지수 곡선)
7. Response Curve - User Defined (사용자 정의 곡선)
8. FOV Scaling (시야각 스케일링)
9. To World Space (월드 공간 변환)
기타 모디파이어들
C++나 블루프린트에서 UInputModifier 클래스의 서브클래스를 만들고 ModifyRaw_Implementation 함수를 오버라이드하여 커스텀 입력 모디파이어를 만들 수 있습니다.

아래는 라이라 게임 샘플에서 사용한 입력 모디파이어 예시입니다.
/** 라이라 공유 게임 세팅의 설정에 따라 축 값 반전을 적용합니다 **/
UCLASS(NotBlueprintable, MinimalAPI, meta = (DisplayName = "Lyra Aim Inversion Setting"))
class ULyraInputModifierAimInversion : public UInputModifier
{
GENERATED_BODY()
protected:
virtual FInputActionValue ModifyRaw_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue CurrentValue, float DeltaTime) override
{
ULyraLocalPlayer* LocalPlayer = LyraInputModifiersHelpers::GetLocalPlayer(PlayerInput);
if (!LocalPlayer) return CurrentValue;
ULyraSettingsShared* Settings = LocalPlayer->GetSharedSettings();
ensure(Settings);
FVector NewValue = CurrentValue.Get<FVector>();
if (Settings->GetInvertVerticalAxis())
NewValue.Y *= -1.0f;
if (Settings->GetInvertHorizontalAxis())
NewValue.X *= -1.0f;
return NewValue;
}
};

입력 트리거는 위에서 모디파이어 목록을 모두 거치고, 사용자 입력이 IMC에서 해당 입력 액션을 활성화할지 여부를 결정합니다.
-> 즉, 언제 액션이 실행될지 결정하는 규칙
💡 흐름
원시 입력 → 모디파이어들 → 트리거 → 액션 실행
// 기본 제공되는 트리거들
- Press (누르기)
- Release (놓기)
- Hold (길게 누르기)
- Tap (짧게 누르기)
- Pulse (펄스)
- Down (눌려있는 동안)
- Combo (조합)
점프 액션 - Press 트리거
IA_Jump + Space키 + Press 트리거
→ 스페이스바를 누르는 순간에만 점프
대시 액션 - Tap 트리거
IA_Dash + Shift키 + Tap 트리거 (0.2초 이내)
→ Shift를 빠르게 눌렀다 떼면 대시
차징 공격 - Hold 트리거
IA_ChargeAttack + 마우스좌클릭 + Hold 트리거 (2초)
→ 마우스를 2초 이상 누르고 있으면 차징 공격