Unreal Engine/C++

[Unreal Engine C++] EnhancedInputSystem의 입력 값 구하기

한돌이 2024. 3. 15. 16:21

 EnhancedInputSystem

 

 언리얼 엔진 4 은 기본 입력 동작 및 축 설정을 프로젝트 세팅에서 설정하여 사용했습니다. 언리얼 엔진 5부터는 지금까지 사용했던 축 및 액션 매핑은 폐기 되고 대신 향상된 입력 액션 및 입력 매핑 컨텍스트(EnhancedInputSystem)를 사용하라고 권고하고 있습니다.

 

 

 폐기되었다고 축 및 액션 매핑을 사용 수 없다는 것은 아닙니다. 언리얼 엔진 4처럼 사용할 수는 있지만 이후 버전이 올라가면서 버그라던가 업데이트를 지원하지 않는다는 뜻이겠지요.  프로젝트에 따라서 축 및 액션 매핑을 사용하거나, 언리얼 엔진 5에서 사용하는 EnhancedInputSystem을 사용하시면 됩니다.

 EnhancedInputSystem을 사용할 때 입력 키에 해당하는 입력 값을 받고자 합니다. 축 및 액션 매핑의 GetInputAxisValue 함수처럼 말이죠.

 캐릭터의 전방 이동을 나타내는 MoveForward 매핑의 입력 값을 받는다고 할 때 언리얼 엔진 4에서는 다음과 같은 코드를 사용하면 간단하게 구할 수 있습니다.

 

float APRPlayerCharacter::GetMoveForward() const
{
	return GetInputAxisValue("MoveForward");
}

 

 캐릭터의 이동을 나타내는 ActionInput의 값 타입을 Axis2D(Vector2D)로 생성해서 MoveForward 매핑처럼 값을 가져오는 코드는 다음과 같습니다.

 

.h

/** 이동 입력 액션 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
class UInputAction* InputMove;
.cpp

float APRPlayerCharacter::GetMoveForward() const
{
	UnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent);
	FEnhancedInputActionValueBinding* MoveActionBinding = &EnhancedInputComponent->BindActionValue(InputMove);

	return MoveActionBinding->GetValue().Get<FVector2D>().Y;	// MoveForward 값
}

 

위의 코드는 다음과 같이 사용할 수도 있습니다.

 

.h

/** 이동 입력 액션 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
class UInputAction* InputMove;

/**
 * 캐릭터의 이동 InputAction과 그에 대응하는 값 사이의 매칭을 저장한 구조체입니다.
 * UPROPERTY()를 사용할 수 없는 구조체입니다.
 */
struct FEnhancedInputActionValueBinding* MoveActionBinding;
.cpp

void APRPlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
    
	...

	EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);
	if(EnhancedInputComponent)
	{
		// 이동
		EnhancedInputComponent->BindAction(InputActions->InputMove, ETriggerEvent::Triggered, this, &APRPlayerCharacter::Move);
		MoveActionBinding = &EnhancedInputComponent->BindActionValue(InputActions->InputMove);		// 이동 InputAction의 입력 값을 바인딩합니다.
	}
}

float APRPlayerCharacter::GetMoveForward() const
{
	return MoveActionBinding->GetValue().Get<FVector2D>().Y;	// MoveForward 값
}