삼인칭으로 프로젝트를 만들면 생성되는 ThirdPersonCharacter와 Enhanced Input으로 구현되어있는 입력 분석하기
InputAction의 MoveAction에 바인딩 되어있는 Move함수이다.
void APlayerBase::Move(const FInputActionValue& Value) { // input is a Vector2D FVector2D MovementVector = Value.Get<FVector2D>(); if (Controller != nullptr) { // find out which way is forward const FRotator Rotation = Controller->GetControlRotation(); const FRotator YawRotation(0, Rotation.Yaw, 0); // get forward vector const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); // get right vector const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); // add movement AddMovementInput(ForwardDirection, MovementVector.Y); AddMovementInput(RightDirection, MovementVector.X); } }
- FInputActionValue& Value : InputAction에서 설정한 값을 입력받는 함수 인자이다.
- FVector2D MovementVector = Value.Get<FVector2D>();
: IA_Move에서 값 타입을 Vector2D로 설정했으므로 Value.Get<FVector2D>() 를 통해 입력 값을 받아 변수에 저장한다.- Control Rotation의 Yaw를 기반으로 ForwardVector, RightVector구하기
: GetControlRotation() 으로 컨트롤 로테이션을 구한다. 그 값은 0~360도 다.
구한 컨트롤 로테이션에서 Yaw 값만 사용한다.
YawRotation으로 FRotationMatrix함수를 통해 회전행렬을 구하고 GetUnitAxis(EAxis::X)로 X축의 값만 구해서 ForwardDirection을 구한다.
이는 YawRotation(Θ)만큼 회전한 컨트롤러의 X축이 월드기준 X, Y축에 얼마정도의 값을 가지는지 구하는 것이다.
예를들어 Yaw가 30도라면 컨트롤 X의 방향벡터2D를 구하는것이므로 월드 X축에 대한 값은 1 cos(30)이므로 약 0.86, 월드 Y축에 대한 값은 1 sin(30)이므로 약 0.5이다. 그러므로 ForwardDirection는 (0.86, 0.5, 0.0)이 된다.
컨트롤 Y는 1 cos(120) = -0.5, 1 sin(120) = 0.86 이므로
RightDirection = (-0.5, 0.86, 0.0)이 된다.
이렇게 구한 ForwardDirection와 RightDirection를 기반으로
AddMovementInput(ForwardDirection, MovementVector.Y)와
AddMovementInput(RightDirection, MovementVector.X)로 캐릭터를 이동시키는데
왜 ForwardDirection은 X축을 기준으로 구했으면서 MovementVector는 Y값이고
RightDirection은 X값인지는 이 시리즈의 1번글을 보면 알 수 있다.
요약하자면 원래 InputAction은 입력값을 Vector2D로 하더라도
아무 Modifier가 없으면 WASD무슨키를 누르던 X만 1을 반환한다.
그래서 W, S를 누를 때 Modifier의 스위즐 입력 축 값 변경을 통해 X입력을 Y입력으로 변환시켜주기 때문에 W나 S로 인한 앞 뒤 이동은 MovementVector.Y를 사용한다.
그렇게 RightDirection은 MovementVector.X를 사용한다.
void APlayerBase::Look(const FInputActionValue& Value) { // input is a Vector2D FVector2D LookAxisVector = Value.Get<FVector2D>(); if (Controller != nullptr) { // add yaw and pitch input to controller AddControllerYawInput(LookAxisVector.X); AddControllerPitchInput(LookAxisVector.Y); } }
여기서도 FInputActionValue를 FVector2D로 변환해서 변수화한다.
IA_Look은 IMC에서 마우스 XY 2D축으로 되어있으므로 그대로 X, Y를 사용하면 된다.
//Jumping EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);
Jump함수는 ACharacter::Jump, ACharacter::StopJumping 을 각각 Triggered와 Completed에 바인드 되어있다.