ThirdPersonCharacter와EnhancedInput (3)

YH J·2023년 12월 13일
0

UE5 C++

목록 보기
8/10
post-custom-banner

삼인칭으로 프로젝트를 만들면 생성되는 ThirdPersonCharacter와 Enhanced Input으로 구현되어있는 입력 분석하기

1. Move 함수

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를 사용한다.

2. Look 함수

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를 사용하면 된다.

3. Jump 함수

//Jumping
		EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump);
		EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);

Jump함수는 ACharacter::Jump, ACharacter::StopJumping 을 각각 Triggered와 Completed에 바인드 되어있다.

profile
게임 개발자 지망생
post-custom-banner

0개의 댓글