Unreal

[Unreal5] Input Action와 Input Mapping Context 사용방법

usingsystem 2024. 6. 3. 21:33
728x90

Input Action

플레이어의 입력을 처리하기 위한 중요한 구성 요소로 게임 내에서 키보드, 마우스, 게임패드 등 다양한 입력 장치를 통해 발생하는 이벤트를 간편하게 관리하고 처리할 수 있습니다.

Value Type

Value Type 설명

Digital

  • 설명: 디지털 입력은 이진 입력입니다. 즉, 입력이 참(True) 또는 거짓(False)인 경우를 처리합니다. 키보드의 키 누름, 마우스 버튼 클릭, 게임패드 버튼 누름과 같은 입력에 사용됩니다.
  • : 스페이스바를 눌러 점프하는 동작, 마우스 왼쪽 버튼을 눌러 총을 쏘는 동작. 
UEnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &AMyCharacter::Jump);

Axis1D

  • 설명: 1차원 축 입력입니다. 이는 주로 아날로그 입력을 처리하는 데 사용되며, 입력 값은 -1에서 1 사이의 부동 소수점 값입니다. 게임패드의 아날로그 스틱이나 마우스 축 움직임에 사용됩니다.
  • : 캐릭터의 앞뒤 이동 (W와 S 키 또는 게임패드의 왼쪽 스틱의 Y축).
UEnhancedInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);

Axis2D

  • 설명: 2차원 축 입력입니다. 두 개의 1차원 축을 결합한 것으로, X와 Y 값으로 구성된 벡터를 사용합니다. 주로 게임패드의 아날로그 스틱, 마우스 움직임 또는 터치 입력을 처리하는 데 사용됩니다.
  • : 캐릭터의 이동 방향 (게임패드의 왼쪽 스틱), 카메라의 회전 (마우스 움직임).
UEnhancedInputComponent->BindAxis2D("Look", this, &AMyCharacter::Look);

Axis3D

  • 설명: 3차원 축 입력입니다. X, Y, Z 값으로 구성된 벡터를 사용하며, 주로 3차원 공간에서의 이동이나 회전 입력을 처리하는 데 사용됩니다.
  • : VR 컨트롤러의 위치 추적, 3D 공간 내의 방향 이동.
UEnhancedInputComponent->BindAxis3D("Move3D", this, &AMyCharacter::Move3D);

사용 예시

Digital  입력 예시

  • 키보드 스페이스바를 사용하여 점프
UEnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &AMyCharacter::Jump);

1D 축 입력 예시

  • 게임패드의 아날로그 스틱 Y축을 사용하여 앞뒤 이동
UEnhancedInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);

2D 축 입력 예시:

  • 게임패드의 아날로그 스틱을 사용하여 이동 방향 설정
UEnhancedInputComponent->BindAxis2D("MoveDirection", this, &AMyCharacter::MoveDirection);

 3D 축 입력 예시:

  • VR 컨트롤러의 위치를 사용하여 3D 공간 내에서 이동
UEnhancedInputComponent->BindAxis3D("Move3D", this, &AMyCharacter::Move3D);

I nput Mapping Context

Input Mapping Context는 여러 Input Action을 그룹화하고, 각 Input Action을 특정 키나 버튼에 매핑하는 설정을 포함합니다. 이를 통해 개발자는 게임에서 다양한 입력 장치(키보드, 마우스, 게임패드 등)를 쉽게 관리하고 설정할 수 있습니다.

블루프린트 예시

1. Input Action과 Input Mapping Context 생성

 

Input Action과 Input Mapping Context

2. Input Action 설정

3. Input Mapping Context 설정

 

4.블루프린트에서  Input Mapping Context 연결

 Get Controller -> Cast To PlayerController -> getenhancedinputlocal -> Add Mapping Context

 

5. 블루프린트에서 Input Action 연결

 

만들어 놓은 IA_Move-> Format Text -> Print String 으로 출력

소스 예시

1. 먼저 인풋을 사용하기위해 .Build.cs파일에 PublicDependencyModuleNames.AddRange뒤에 EnhancedInput를 추가해 준다.

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" });

 

 

2. PlayerController 생성

 

3. 소스

#pragma once

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

struct FInputActionValue;
/**
 *
 */
UCLASS()
class R1_API AR1PlayerController : public APlayerController
{
	GENERATED_BODY()

public:
	AR1PlayerController(const FObjectInitializer& ObjectInitializer);

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

protected:
	void Input_Test(const FInputActionValue& InputValue);
	void Input_Move(const FInputActionValue& InputValue);
	void Input_Turn(const FInputActionValue& InputValue);

protected:
	UPROPERTY(EditAnywhere, Category = Input)
	TObjectPtr<class UInputMappingContext> InputMappingContext;

	UPROPERTY(EditAnywhere, Category = Input)
	TObjectPtr<class UInputAction> TestAction;

	UPROPERTY(EditAnywhere, Category = Input)
	TObjectPtr<class UInputAction> MoveAction;

	UPROPERTY(EditAnywhere, Category = Input)
	TObjectPtr<class UInputAction> TurnAction;
};

 

#include "Player/R1PlayerController.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "Kismet/KismetMathLibrary.h"


AR1PlayerController::AR1PlayerController(const FObjectInitializer& ObjectInitializer)
	:Super(ObjectInitializer)
{
}

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

	//ULocalPlayer 범위가 있는 싱글톤
	if (auto* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
	{
		Subsystem->AddMappingContext(InputMappingContext, 0);
	}
}

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

	if (auto* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent))
	{
		EnhancedInputComponent->BindAction(TestAction, ETriggerEvent::Triggered, this, &ThisClass::Input_Test);
		EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &ThisClass::Input_Move);
		EnhancedInputComponent->BindAction(TurnAction, ETriggerEvent::Triggered, this, &ThisClass::Input_Turn);
	}

}

void AR1PlayerController::Input_Test(const FInputActionValue& InputValue)
{
	GEngine->AddOnScreenDebugMessage(0, 1.0f, FColor::Cyan, TEXT("Test"));
}

void AR1PlayerController::Input_Move(const FInputActionValue& InputValue)
{
	FVector2D MovementVector = InputValue.Get<FVector2D>();

	if (MovementVector.X != 0)
	{
		FVector Direction = FVector::ForwardVector * MovementVector.X;
		GetPawn()->AddActorWorldOffset(Direction * 50.f);
	}
	if (MovementVector.Y != 0)
	{
		FVector Direction = FVector::RightVector * MovementVector.Y;
		GetPawn()->AddActorWorldOffset(Direction * 50.f);
	}

}

void AR1PlayerController::Input_Turn(const FInputActionValue& InputValue)
{

	float Val = InputValue.Get<float>();
	AddYawInput(Val);
}

4. Input 연결

728x90