




- Modifiers를 통해 입력 값을 음수로 바꾸거나 입력 축의 순서(x, y) → (y, x)를 바꿀 수 있다
// header
struct FInputActionValue;
UCLASS()
class PROJECT_API ARPlayerController : public APlayerController
{
GENERATED_BODY()
public:
ARPlayerController(const FObjectInitializer& ObjectInitializer);
protected:
virtual void BeginPlay() override;
virtual void SetupInputComponent() override;
private:
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;
};
// cpp
ARPlayerController::ARPlayerController(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
void ARPlayerController::BeginPlay()
{
Super::BeginPlay();
// Subsystem은 범위가 있는 싱글톤으로 플레이어의 생명 주기를 따라감
// 대입 하자마자 null check
if(auto* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
{
// Subsystem에 MappingContext 추가
Subsystem -> AddMappingContext(InputMappingContext, 0);
}
}
void ARPlayerController::SetupInputComponent()
{
Super::SetupInputComponent();
if(auto* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent))
{
// 객체를 대상으로 실행하는 것이기 때문에 자신에 대한 포인터를 넘겨준다
// InputAction에 대한 콜백 함수 바인딩
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 ARPlayerController::Input_Test(const FInputActionValue& InputValue)
{
}
void ARPlayerController::Input_Move(const FInputActionValue& InputValue)
{
FVector2d movementVector = InputValue.Get<FVector2d>();
// 0 체크는 효율성 때문
if(movementVector.X != 0)
{
FVector Direction = FVector::ForwardVector * movementVector.X;
GetPawn()->AddActorWorldOffset(Direction*50.f);
}
if(movementVector.Y != 0)
{
FVector Direction = FVector::ForwardVector * movementVector.Y;
GetPawn()->AddActorWorldOffset(Direction*50.f);
}
}
void ARPlayerController::Input_Turn(const FInputActionValue& InputValue)
{
float Val = InputValue.Get<float>(); // x값만 가져옴
AddYawInput(Val);
}
```
- EnhancedInput을 사용하기 위해서 EnhancedInputComponent, EnhancedInputSubsystmes 헤더를 포함시켜야 한다
- Kismet/KismetMathLibrary에는 이동 관련 유틸성 함수가 있다
- Input_Move 개선
```cpp
void ARPlayerController::Input_Move(const FInputActionValue& InputValue)
{
FVector2d movementVector = InputValue.Get<FVector2d>();
// 0 체크는 효율성 때문
if(movementVector.X != 0)
{
// PlayerController의 회전값을 가져옴
FRotator Rotator = GetControlRotation();
// 내가 바라보고 있는 방향에 대한 회전값을 기준으로 앞 방향을 가져옴
FVector Direction = UKismetMathLibrary::GetForwardVector(FRotator(0, Rotator.Yaw, 0));
GetPawn()->AddMovementInput(Direction, movementVector.X); // move가 아닌 MovementInput을 추가한다는 것, 입력하는 방향
}
if(movementVector.Y != 0)
{
FRotator Rotator = GetControlRotation();
FVector Direction = UKismetMathLibrary::GetRightVector(FRotator(0, Rotator.Yaw, 0));
GetPawn()->AddMovementInput(Direction, movementVector.Y);
}
}