언리얼엔진5 공부

언리얼엔진5 공부언리얼엔진 C++ 챕터2 - 2. Enhanced_Input_System을_활용한_입력_매핑_구현하기

Client Side 2025. 9. 23. 20:39

플레이어가 캐릭터를 조작하려면

어떤 버튼을 입력할지 IMC(Input Mapping Context)를 통해 정하고 매핑을 해준다.  ->  스위치 역할

어떤 행동과 연결할지 중간에 행동을 IA(Input Action)을 통해 추상적으로 정한다.  ->  전선 역할

 

 

 

 

SpartaPlayerController.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "SpartaPlayerController.generated.h"

class UInputMappingContext;
class UInputAction;

UCLASS()
class SPARTAPROJECT_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;

		virtual void BeginPlay() override;
};
  • 블루프린트에서 IA와 IMC를 전부 입력한 후 위와같이 멤버변수를 만들어준다.

 

 

 

SpartaPlayerController.cpp

#include "SpartaPlayerController.h"
#include "EnhancedInputSubsystems.h" // Enhanced Input System의 Local Player Subsystem을 사용하기 위해 포함

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

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

		// 현재 PlayerController에 연결된 Local Player 객체를 가져옴    
    if (ULocalPlayer* LocalPlayer = GetLocalPlayer())
    {
		    // Local Player에서 EnhancedInputLocalPlayerSubsystem을 획득
        if (UEnhancedInputLocalPlayerSubsystem* Subsystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
        {
	          if (InputMappingContext)
            {
            		// Subsystem을 통해 우리가 할당한 IMC를 활성화
		            // 우선순위(Priority)는 0이 가장 높은 우선순위
                Subsystem->AddMappingContext(InputMappingContext, 0);
            }
        }
    }
}
  • IMC 활성화코드 작성
    • 언리얼엔진5의 Enhanced Input System은 Local Player Subsystem 을 통해 Input Mapping Context를 활성화하거나 비활성화 한다.
    • Local Player SubSystem
      • 게임이 실행되면 언리얼은 각 Player를 표현하기 위해 Local Player 객체를 생성한다.
        • 싱글플레이어 상황에서는 하나의 Local Player
        • 멀티플레이어 상황에서는 플레이어 수 만큼의 Local Player가 생성된다.
      • UEnhancedInputLocalPlayerSubsystem은 Local Player에 부착되어, 해당 플레이어가 사용할 입력 매핑 (IMC)을 관리한다.
        • 이를 통해, 플레이 중에 동적으로 다른 IMC를 추가, 제거하여 입력 모드를 전환 할 수 있다.

 

  • GetLocalPlayer()
    • 현재 PlayerController가 관리하는 Local Player를 반환한다.
  • GetSubsytem<UEnhancedInputLocalPlayerSubsystem>()
    • 해당 Local Player에 부착된 Enhanced Input Subsystem을 반환한다.
    • 이를 통해 AddMappingContext나 RemoveMappingContext 등을 호출하여 입력매핑을 동적으로 제어할 수 있다.
  • AddMappingContext()
    • 주어진 IMC를 Subsystem에 추가하여 입력 매핑을 활성화한다.
    • SpartaInputMappingContext : 활성화할 IMC.
    • 0 : 우선순위, 낮을수록 높은 우선순위를 가진다.
    • 이 함수를 여러 번 호출해 여러 IMC를 활성화할 수도 있다.
      • 우선순위를 달리 부여해, 특정 IMC가 다른 IMC보다 우선순위가 높도록 설정할수도 있다.