본문 바로가기

게임프로그래밍/실습2

[실습2] 5. 인풋 매핑하기

1. 인풋 매핑하기

 

컨텍스트를 만들고 이걸 통해 로컬플레이어 서브시스템 클래스까지 만들었다. 이제 인풋 액션을 매핑하는 법을 알아보도록 하자.

 

virtual void SetupInputComponent() override;

 

해당 함수는 폰이나 캐릭터 클래스의 인풋을 설정하기 위한 함수이다. 이를 오버라이드 하여 사용하자.

 

#include "EnhancedInputComponent.h"


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

    UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(InputComponent);
}

 

플레이어 컨트롤러 클래스에는 기본적으로 인풋컴포넌트가 존재한다. 이것을 향상된 인풋 컴포넌트로 캐스팅하여 사용할 것이다.

 

그리고 이제 인풋 액션을 바인딩할 것이다. 바인딩 하기 위해서는 인풋 액션을 담을 변수와 콜백 함수가 필요하다.

 

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

void Move(const FInputActionValue& InputActionValue);

 

이제 바인딩을 해보자.

 

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

    UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(InputComponent);

    EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AAuraPlayerController::Move);
}

 

MoveAction을 Move 함수와 바인딩 하였다.

 

이제 Move 함수를 구현하자.

 

void AAuraPlayerController::Move(const FInputActionValue& InputActionValue)
{
    const FVector2D InputAxisVector = InputActionValue.Get<FVector2D>();
    const FRotator Rotation = GetControlRotation();
    const FRotator YawRotation(0.f, Rotation.Yaw, 0.f);

    const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
    const FVector RightDirection =  FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

    if (APawn* ControlledPawn = GetPawn<APawn>())
    {
       ControlledPawn->AddMovementInput(ForwardDirection, InputAxisVector.Y);
       ControlledPawn->AddMovementInput(RightDirection, InputAxisVector.X);
    }
}

 

무브함수가 이렇게 구성되는 이유는 아래 영상 (정확히는 이 다음 영상)에 잘 나와있다.

 

 

이제 컴파일을 하고 에디터로 돌아가 이 클래스를 기반으로 블루프린트 클래스를 만들고 이 클래스를 기본 컨트롤러 클래스로 만들면 된다. 물론 이를 위해서는 게임모드 클래스를 만들 필요가 있을 것이다.