Enhanced Input System로 캐릭터 움직임 키 매핑하기

김민수·2025년 1월 24일

언리얼 C++

목록 보기
26/32

Enhanced Input System은 언리얼 엔진에서 기존 입력 시스템을 대체하는 새롭게 확장된 입력 처리 시스템이다. 입력을 다양한 플랫폼에서 쉽게 관리할 수 있도록 설계되었다.


1. Enhanced Input System의 특징

  1. 입력 맵핑(Context) 기반 구조

    • 입력을 Input Mapping Context에 정의해서 재사용이 가능하다.
    • 플랫폼별 입력(키보드, 게임패드, 터치스크린 등)을 한곳에서 통합적으로 관리할 수 있다.
  2. Input Action

    • 각 입력을 Input Action으로 정의한다.
    • 액션마다 Value Types(예: 축 값, 방향, Bool 값 등)을 설정해서 입력 데이터를 처리한다.
  3. 플랫폼 독립성

    • 키보드, 마우스, 게임패드, 터치스크린 등을 다양한 플랫폼을 지원하며, 입력 디바이스에 따라 자동으로 전환된다.


2. Input Action 생성

  1. 각 Input Action을 생성한다:
    • IA_Move
    • IA_Jump
    • IA_Look
    • IA_Sprint
  2. 각 Input Action에 Value Type을 설정한다:
    • Move: Axis2D (이동을 위한 2D 입력)
    • Jump: Digital(bool) (점프와 같이 단순 On/Off 입력)
    • Look: Axis2D (카메라 회전을 위한 2D 입력)
    • Sprint: Digital(bool) (달리기와 같이 단순 On/Off 입력)
  3. 필요에 따라 TriggersModifiers를 설정한다:
    • Triggers: 입력방식을 설정한다. 예를 들어:
      • Pressed : 키보드 입력을 처음 눌렀을 때
      • Released : 키보드 입력을 뗐을 때
      • Hold : 계속 누르고 있을 때
    • Modifiers: 입력 값을 설정한다.
      • Scale : 입력 값에 곱셈 스케일을 적용
      • Invert : 입력 축 값을 반전
      • Dead Zone : 작은 입력 값(예: 게임패드 스틱의 미세 움직임)을 무시


3. Input Mapping Context (IMC) 생성

  1. MappingsInput Actions를 추가해서 매핑시킨다:
    • IA_Move
    • IA_Jump
    • IA_Look
    • IA_Sprint
  2. 각 항목에 키를 지정하고 세부 설정을 한다.
    • IA_Move
      • W :
        • Swizzle Input Axis Values : XZY로 설정
          -> 기본적으로 W는 전진(X축) 입력으로 동작한다.
      • S :
        • Swizzle Input Axis Values : XZY로 설정
        • Negate : X, Y, Z 모두 체크
          -> 후진(-X축) 입력을 위해 값을 반전시킨다.
      • A :
        • Swizzle Input Axis Values : YXZ로 설정
        • Negate -> X, Y, Z 모두 체크
          -> 왼쪽(-Y축) 입력을 위해 값을 반전시킨다.
      • D :
        • Swizzle Input Axis Values : YXZ로 설정
          -> 오른쪽(Y축) 입력으로 동작한다.
    • IA_Jump
      • Space Bar :
        • 별도의 Modifiers 설정을 할 필요 없다. 단순한 On/Off 동작이기 때문에
    • IA_Look
      • Mouse XY 2D-Axis :
        • Negate : Y만 체크
          -> 기본적으로 마우스 Y축의 움직임은 위로 움직일 때 양수이고, 아래로 움직일 때 음수로 전달된다. 하지만 카메라의 상하 회전(Pitch)은 엔진의 좌표계에서 위로 움직일 때 음수이고, 아래로 움직일 때 양수로 작동하는 경우가 많기 때문에 값을 반전시킨다. 만약 X축(좌우 회전, Yaw)의 경우, 기본적인 엔진 좌표계와 마우스 움직임 방향이 일치하기 때문에 값을 반전시키지 않아도 된다.
    • IA_Sprint
      • Left Shift :
        • 별도의 Modifiers 설정을 할 필요 없다. 단순한 On/Off 동작이기 때문에


4. Enhanced Input 추가

SpartaPlayerController.h

#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;
};

SpartaPlayerController.cpp

#include "SpartaPlayerController.h"

ASpartaPlayerController::ASpartaPlayerController()
	: InputMappingContext(nullptr),
	  MoveAction(nullptr),
	  JumpAction(nullptr),
	  LookAction(nullptr),
	  SprintAction(nullptr)
{
}


5. Input Mapping Context 연결

InputMappingContext와 각 InputAction을 에디터에서 연결한다:

  • InputMappingContext: PlayerInputMapping
  • MoveAction: IA_Move
  • JumpAction: IA_Jump
  • LookAction: IA_Look
  • SprintAction: IA_Sprint


6. IMC 활성화

SpartaPlayerController.h

#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;
};

SpartaPlayerController.cpp

#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())
  • 현재 PlayerController와 연결된 LocalPlayer 객체를 가져온다.
  • LocalPlayer
    • LocalPlayer는 플레이어 입력과 화면 정보를 관리하는 클래스다.
    • 각 플레이어(싱글플레이 또는 멀티플레이)가 고유의 LocalPlayer를 가지며, Enhanced Input System을 통해 입력 처리가 가능하다.
  • 왜 필요한가?
    • Enhanced Input System은 LocalPlayer에 속한 Subsystem을 사용하기 때문에, LocalPlayer를 먼저 가져와야 한다.

(2) Enhanced Input Subsystem 가져오기

if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
    LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
  • LocalPlayer의 EnhancedInputLocalSubsystem을 가져온다.
  • UEnhancedInputLocalPlayerSubsystem
    • Enhanced Input System에서 입력 맵핑(Context) 및 입력 처리 로직을 관리하는 클래스다.
    • 각 LocalPlayer에 존재하며, 입력 맵핑 추가, 제거 등을 처리한다.
  • 왜 필요한가?
    • Enhanced Input System의 핵심 기능(입력 맵핑 관리)을 Subsystem이 처리한다.

(3) Input Mapping Context 추가

Subsystem->AddMappingContext(InputMappingContext, 0);
  • Enhanced Input Subsystem에 Input Mapping Context를 등록한다.
  • AddMappingContext
    • 입력 맵핑을 Subsystem에 등록해서 입력 처리를 활성화한다.
    • 매개변수:
      • InputMappingContext: 추가할 Input Mapping Context
      • 0 (Priority): 우선순위 값. 낮은 값일수록 높은 우선순위를 가진다.
profile
안녕하세요

0개의 댓글