Unreal 2-2 입력 매핑

별빛에소원을·2025년 1월 22일

TeamSparta-Unreal1기

목록 보기
14/18
post-thumbnail

PlayerController

Player의 입력은 Controller에서 처리하게 되어 있다.
입력이 Mouse가 될수도 Keyboard가 될 수도 레벨에 따라서 입력에 따라서 결과가 달라질 수 있으므로
따로 관리하기 위한 Class이다.


주요기능

  • 입력처리
    • Enhanced Input System : Unreal5도입(입력을 처리)
      • Input Mapping System(IMC) : IA를 관리한다.
      • Input Action(IA) : 추상적인 동작을 정의한다.
      • C++에서는 SetupInputComponent() 함수를 오버라이드하여
    • 카메라 제어로직
      • 마우스나 게임패드의 축 입력을 받아 시점 회전이나 줌 인/아웃 같은 동작을 수행
    • UI 상호작용(버튼을 누르거나 DragAndDropEvent 처리)
      • 언리얼 모션 그래픽(UMG)기반 UI를 통해 버튼을 클릭하거나, 드래그, 터치등의 이벤트를 Controller에서 받을 수 있다.
      • 인벤토리, 스킬 사용 등의 명령을 UI에서 트리거하면, PlayerController가 이를 해석해 pawn또는 GameMode등 다른 시스템으로 전달한다.
    • Possess 케릭터나 Pawn을 움직이게 만든다.

Controller생성후

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "SpartaGameMode.generated.h"

UCLASS()
class SPARTAPROJECT_API ASpartaGameMode : public AGameMode
{
		GENERATED_BODY()
		
public:
		ASpartaGameMode();
};
ASpartaGameMode::ASpartaGameMode()
{
		DefaultPawnClass = ASpartaCharacter::StaticClass();
    PlayerControllerClass = ASpartaPlayerController::StaticClass();
}

게임모드가 생성될시 PlayerControllerClass에 등록한다.


Enhanced Input System 개요

  1. 언리얼5 부터 전역 인풋 시스템을 대체하거나 확장하기 위해 개발된 시스템이다.
  2. 입력맵(IMC)와 입력액션(IA)로 나뉘어 관리가 된다.

IA(InputAction)

설명

  • IA는 이동, 점프, 발사, 줌과 같이 특정 동작을 추상화한 단위이다.
  • 이동을 담당하는 WASD같은 키는 IA_MOVE와 같이 구분이 된다.

생성방법

옵션

Value Type : 입력되는 값의 타입

  • Bool(참/거짓)
    • 단순 On/Off 토글 입력에 사용된다.(ex 점프, 공격, 스프린트)
  • Axis1D(1차원 축 값)
    • 단일 축 (-1 ~ 1)의 정규값을 받으며 패드에서 가속페달 혹은 전진 후진 값 같은 것에 사용된다.
  • Axis2D(2차원 축 값)
    • X,Y두 축을 동시 사용해야 할 경우 이용된다.
    • Ex) WASD, 마우스 이동 (가로 , 세로)
  • Axis3D(3차원 축 값)
    • 세 축을 동시 처리한다.
    • Ex) 비행 시뮬레이션

Trigger : 입력이 활성화 되는 조건

  • Presed Trigger : 키를 누르는 순간에 동작
  • Hold Trigger : 키를 일정 시간 눌렀을 때 동작
  • Released Trigger : 키를 땔 때 동작

Modifier : 입력값을 수정하거나 변환

  • Scale : 입력값에 배율을 곱한다.(Mouse 이동속도 2배)
  • Invert : 입력값 반전(상하 반전 카메라)
  • DeadZone : 임계값보다 작은 값은 무시한다.

IA설정

ex)IA_Move

앞/뒤, 왼쪽/오른쪽만 이동하면 되기에 ValueType은 Axis2D로 설정한다.
IA_Move는 항상 활성화 된 상태에서 WASD 입력만으로 동ㅈ가해야 하므로 트리거나 모디파이어가 필요하지 않다 Shift 키를 눌러야만 이동 가능 같은 조건이 없다면 필요없다.


IMC

  • 여러 개의 IA를 관리하는 Maanger이다.
  • 특정 상황이나 객체의 움직임을 미리 정의해놓고 상황에 따라 관리할 수 있기 때문에 활용도가 높다.

매핑

Move


Swizzle Input AxisValue
입력 축을 변환하거나, 재구성하는 기능이다. 언리얼에서 XYZ축 중 하나로 매핑한다. Swizzle은 이 값이 올바른 축에 맞지 않을 경우, 재배치하거나 변환하게 해준다.

  • W : 앞뒤 방향에 맞춰 정렬된다. X축 +1이 방향이므로 추가 변환은 필요 없다.
  • S : X축-1이기에 Negate를 통해 값을 뒤집는다.
  • A : Y축에 맞춰 정렬한다 -1이 왼쪽이기에 Negate를 통해 값을 뒤집는다.
  • D : Y축에 맞춰 정렬한다. 추가 변환은 필요 없다.

Look

  • 마우스의 경우 움직임을 통해 Yaw와 Pitch값을 전달받는다.
  • Axis2D로 지정한 X축, Y축 값을 게임 내 좌표계에 맞춰 회전에 반영시킨다.
    Y축값(Pitch)
    입력값 위는 양수, 아래는 음수이므로 Negate를 써서 반전시키면 상하반전을 없앨 수 있다.
    X축값(Roll)
    입력값 변동이 없기에 그대로 사용한다.

IMC 코드 활성화

  • Enhanced Input System은 LocalPlayerSubsystem을 통해 InputMappingContext를 활성화 하거나 비활성화 한다.
  • LocalPlayerSubsystem이란
    • 게임이 실행되면 언리얼은 각 플레이어를 표현하기 위해 LocalPlayer객체를 만든다.
      • 싱글플레이어 상황에서는 하나의 LocalPlayer
      • 로컬 멀티플레이어(하나의 화면에서 여러명이 플레이)라면 플레이어 수만큼 LocalPlayer가 생성된다.
    • UEnhancedInputLocalPlayerSubsystem은 LocalPlayer에 부착되어, 해당 플레이어가 사용할 IMC를 관리한다.
      • 이를 통해, 플레이 중 동적으로 다른 IMC를 추가/제거하여 입력모드를 전환할 수 있다.
      • 전투중(IMC_Char) -> UI창 열림(IMC_UI)->전투 종료후 다시 IMC_Char
#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;
};
#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);
            }
        }
    }
}
  • GetPlayerLocal()
    • 현재 PlayerController가 관리하는 LocalPlayer를 반환한다.
  • GetSubsystem<UEnhancedInputLocalPlayerSubsystem>()
    • 해당 LocalPlayer에 부착된 EnhancedInputSubsystem을 반환한다.
    • 이를 통해 AddMappingContext나, RemoveMappingContext를 호출하여 동적으로 제어가 가능하다.
  • AddMappingContext()
    • 주어진 IMC를 Subsystem에 추가하여 입력 매핑을 활성화
    • SpartaInputMappingContext : 활성화 할 IMC
    • 0 : 우선순위. 낮을수록 높은 우선순위를 가진다.
    • 이 함수를 여러번 호출해 여러 IMC를 활성화 가능하다.
      • 우선순위를 달리 부여해, 특정 IMC가 다른 IMC보다 우선순위가 높도록 설정할 수 있다.
  • 로직이 실행되면, IMC에 정의된 모든 IA와 키 매핑이 이 PlayerController에 적용된다.
profile
취미로 게임하는사람

0개의 댓글