본문으로 건너뛰기
Unreal Engine C++ 기초집LESSON 09

Enhanced Input 기초

난이도초급
예상 시간45분
선수지식8강의 Character와 Controller

9강. Enhanced Input 기초

1. 이번 강의에서 해결할 문제

WASD 키를 C++ 함수에 직접 묶으면 키 변경과 게임패드 지원이 코드 수정으로 이어집니다. 행동의 의미와 실제 키를 분리해 플레이어 이동과 공격 요청을 만듭니다.

2. 학습 목표

3. 핵심 개념

Enhanced Input은 Input Action, Mapping Context, Modifier, Trigger를 사용합니다. Action은 Move나 Attack처럼 행동의 의미이고 Mapping Context는 키와 Action의 연결 집합입니다. 같은 Action을 키보드와 게임패드에 동시에 매핑할 수 있습니다.

공식 Enhanced Input 문서의 기본 개념은 UE5 계열에서 유지되지만 에디터 자산 메뉴와 API 세부 형태는 엔진 버전에 따라 달라질 수 있습니다.

4. 단계별 실습

파일 경로: Source/TopDownSurvival/Player/SurvivalPlayerController.h

SurvivalPlayerController.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "InputActionValue.h"
#include "SurvivalPlayerController.generated.h"

class UInputAction;
class UInputMappingContext;

UCLASS()
class TOPDOWNSURVIVAL_API ASurvivalPlayerController : public APlayerController
{
GENERATED_BODY()

protected:
virtual void BeginPlay() override;
virtual void SetupInputComponent() override;

UPROPERTY(EditDefaultsOnly, Category = "Input")
TObjectPtr<UInputMappingContext> DefaultMappingContext;

UPROPERTY(EditDefaultsOnly, Category = "Input")
TObjectPtr<UInputAction> MoveAction;

UPROPERTY(EditDefaultsOnly, Category = "Input")
TObjectPtr<UInputAction> AttackAction;

private:
void HandleMove(const FInputActionValue& Value);
void HandleAttack();
};

파일 경로: Source/TopDownSurvival/Player/SurvivalPlayerController.cpp

SurvivalPlayerController.cpp
#include "Player/SurvivalPlayerController.h"

#include "Characters/SurvivalCharacter.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputAction.h"
#include "InputMappingContext.h"

void ASurvivalPlayerController::BeginPlay()
{
Super::BeginPlay();

if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
{
if (DefaultMappingContext)
{
Subsystem->AddMappingContext(DefaultMappingContext, 0);
}
}
}

void ASurvivalPlayerController::SetupInputComponent()
{
Super::SetupInputComponent();

UEnhancedInputComponent* EnhancedInput =
CastChecked<UEnhancedInputComponent>(InputComponent);
if (MoveAction)
{
EnhancedInput->BindAction(MoveAction, ETriggerEvent::Triggered,
this, &ASurvivalPlayerController::HandleMove);
}
if (AttackAction)
{
EnhancedInput->BindAction(AttackAction, ETriggerEvent::Started,
this, &ASurvivalPlayerController::HandleAttack);
}
}

void ASurvivalPlayerController::HandleMove(const FInputActionValue& Value)
{
if (ASurvivalCharacter* Character = Cast<ASurvivalCharacter>(GetPawn()))
{
Character->Move(Value.Get<FVector2D>());
}
}

void ASurvivalPlayerController::HandleAttack()
{
if (ASurvivalCharacter* Character = Cast<ASurvivalCharacter>(GetPawn()))
{
Character->PerformAttack();
}
}

Character 헤더에 void PerformAttack();을 public으로 선언하고 현재 구현은 로그만 남깁니다.

SurvivalCharacter.cpp · 임시 공격
void ASurvivalCharacter::PerformAttack()
{
UE_LOG(LogTemp, Display, TEXT("Attack requested"));
}

Unreal Editor

  1. IA_Move는 Axis2D, IA_Attack은 Digital Bool로 생성합니다.
  2. IMC_Player를 만들고 WASD를 IA_Move에 매핑합니다. W/S에는 Swizzle과 Negate Modifier를 방향에 맞게 설정합니다.
  3. Space 또는 마우스 왼쪽을 IA_Attack에 매핑합니다.
  4. BP_SurvivalPlayerController 기본값에 세 에셋을 연결합니다.

5. 코드가 동작하는 이유

LocalPlayer Subsystem은 로컬 사용자별 Mapping Context를 관리합니다. Triggered는 이동 값이 유효한 동안 반복 전달되고 Started는 공격 입력 시작 순간 한 번 호출됩니다. Controller가 행동 요청을 해석하고 Character가 실제 이동·공격 능력을 수행합니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

Enhanced Input 기초 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Enhanced Input 기초”의 역할과 의존성을 판단하는 올바른 기준은 무엇인가요?
  2. 문제 2‘Move Action을 Bool로 생성’ 상태에 관한 “Enhanced Input 기초” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

9강. Enhanced Input 기초 미완료 상태