UE5/UE5 기초

UE5기초)Enhanced input

PJNull 2023. 6. 13.
728x90
반응형

Enhanced input

Enhanced input은 Unreal 5.1에서 새로 추가된 개념이다. 그렇다면 이전 버전까지 쓰고 있던 바인딩 input은 왜 사용하지 않게 된것인가? 그 이유는 인풋이 겹치게 되면 생기는 문제점에 있다. 예를 들자면 평상시의 E버튼과 무언가를 타고 있을때의 E버튼이 다르게 작동한다고 가정했을때 바인딩된 인풋은 키가 고정되어 있기 때문에 이를 처리하기 위해서는 항상 플레이어의 상태를 확인하고 그에 맞는 처리를 했어야됐다. 또한 버튼을 살짝 눌렀거나 하는 부분을 프로그래머가 예외처리로 체크해야하는 번거로움도 존재하였다. 이러한 문제점들을 보안한 것이 Enhanced input이다.

 

Input Action

Input Action은 행동을 정의하는 단계이다.

 

 

bool:0,1만의 값을 입력값으로 준다.

float:-1~1값을 입력값으로 준다.(이때 조이스틱이 아닌 -값은 IMC의 Modifiers Negate에서 설정이 가능하다.)

Vector2D:(-1,-1)~(1,1)값을 입력값으로 준다.(배열의 두번째 원소를 사용하고 싶다면 Modifiers Swizzle을 사용하면 된다.

Input Mapping Context 

Input Action은 행동을 정의하는 단계였다면 IMC는 이러한 행동들을 묶어주는 역할을 한다. 기존의 바인딩 인풋에서 인풋을 바인딩하는 형태와 매우 유사하다. 인풋 바인딩에서는 키를 바인딩하고 스케일을 넣어주는것만 가능했던 반면 IMC는 매핑에 따른 옵션을 넣어줄수 있다는 점이 차이점이다.

 

 

 

블루프린트 적용

 

인풋바인딩과 다르게 Enhanced Input에서는 여러 옵션들이 존재한다. Triggered는 누르고 있는 상태가 계속될때, Started는 눌럿을때, Completed는 완료했을때를 처리해준다.

 

 

 

 

C++ Enhanced Input 추가

 

먼저 Build.cs에서 EnhancedInput을 사용하겠다고 설정해준다.

 

다음으로 헤더파일에 아래의 코드를 추가해준다.

#include "InputActionValue.h"


	UFUNCTION()
	void IA_MOVE(const FInputActionValue& Value);
	
	UFUNCTION()
	void IA_Turn(const FInputActionValue& Value);

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input, meta = (AllowPrivateAccess = "true"))
	class UInputMappingContext* InputMappingContext;
	
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input, meta = (AllowPrivateAccess = "true"))
	class UInputAction* MoveAction;
	
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input, meta = (AllowPrivateAccess = "true"))
	class UInputAction* TurnAction;

 

cpp에서 EnhancedInput을 사용하기 위해서는 3가지 헤더파일이 필요하다.

#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputMappingContext.h"

 

다음으로 MappingContext와 Action을 설정해준다.

ConstructorHelpers::FObjectFinder<UInputMappingContext>MappingContext(TEXT("파일경로"));
if (MappingContext.Succeeded())InputMappingContext = MappingContext.Object;


ConstructorHelpers::FObjectFinder<UInputAction>MoveAsset(TEXT("파일경로"));
if (MoveAsset.Succeeded())MoveAction = MoveAsset.Object;


ConstructorHelpers::FObjectFinder<UInputAction>TurnAsset(TEXT("파일경로"));
if (TurnAsset.Succeeded())TurnAction = TurnAsset.Object;

 

다음으로 Beginplay에서 Subsystem을 설정해준다.

Super::BeginPlay();
	
	APlayerController* playerController = Cast<APlayerController>(Controller);
	if (playerController)
	{
		auto* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(playerController->GetLocalPlayer());
		
		if (Subsystem)
		{
			Subsystem->AddMappingContext(InputMappingContext,0);

		}
	}

 

Subsystem을 설정했다면 바인딩인풋때랑 마찬가지로 InputComponent에서 해당 Input을 설정해주고 해당 함수를 만들어준다.

Super::SetupPlayerInputComponent(PlayerInputComponent);

	UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);

	if (EnhancedInputComponent)
	{
		EnhancedInputComponent->BindAction(MoveAction,ETriggerEvent::Triggered,this,&AR1Character::IA_MOVE);
		EnhancedInputComponent->BindAction(TurnAction,ETriggerEvent::Triggered,this,&AR1Character::IA_Turn);
	}

 

 


void AR1Character::IA_MOVE(const FInputActionValue& Value)
{

	FVector2D MovementVector = Value.Get<FVector2D>();

	if (MovementVector.X != 0)
	{
		FRotator Rotator = GetControlRotation();
		FVector Direction = UKismetMathLibrary::GetForwardVector(FRotator(0,Rotator.Yaw,0));
		AddMovementInput(Direction,MovementVector.X);
	}

	if (MovementVector.Y != 0)
	{
		FRotator Rotator = GetControlRotation();
		FVector Direction = UKismetMathLibrary::GetRightVector(FRotator(0, Rotator.Yaw, 0));
		AddMovementInput(Direction, MovementVector.Y);
	}
}

void AR1Character::IA_Turn(const FInputActionValue& Value)
{
	float Val = Value.Get<float>();
	AddControllerYawInput(Val);
}

 

728x90
반응형

'UE5 > UE5 기초' 카테고리의 다른 글

UE5기초)마우스 클릭 이동  (0) 2023.06.13

댓글