#10 lock on일 때, strafe movement 구현
Coding/Devlog

#10 lock on일 때, strafe movement 구현

Lock on, Strafe Movement

  • Lock on 상태일 때, strafe movement(게다리 걸음)가 되려면 아래 세가지가 적용돼야 한다.
    1. Lock on Target을 카메라(여기선 컨트롤러와 동일)가 바라봐야한다.
    2. 그 카메라가 바라보는 방향으로 캐릭터도 바라봐야 한다.
    3. 이후 움직임에 대해서 방향을 계산하고 이에 따라 적절한 애니메이션을 재생해야 한다. (Blendspace)
  • 카메라 회전은 #8에서 구현했다.
  • 그 다음으로, 카메라 방향에 따라 캐릭터의 Rotation을 업데이트해야 한다. 간단한 코드인데, Character에서 바로 SetActorRotation에 접근하지 못해서 애먹었다.
void AMainCharacter::LookAtTarget (float DeltaSeconds) const
{
	FVector LockedOnLocation = LockedOnTarget->GetActorLocation();
	LockedOnLocation.Z -= 150.f;
	const FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(GetActorLocation(), LockedOnLocation);
	const FRotator InterpRotation = UKismetMathLibrary::RInterpTo(GetController()->GetControlRotation(), LookAtRotation, DeltaSeconds, 10.f);
	GetController()->SetControlRotation(FRotator(InterpRotation.Pitch, InterpRotation.Yaw, GetController()->GetControlRotation().Roll));
	// 추가된 부분
    const FRotator PawnInterpRotation = UKismetMathLibrary::RInterpTo(GetActorRotation(), FRotator(GetActorRotation().Pitch, GetControlRotation().Yaw, GetActorRotation().Roll), DeltaSeconds, 10.f);
	GetController()->GetPawn()->SetActorRotation(PawnInterpRotation);
}
  • 다음으로 AnimBlueprint 계층에서 Direction을 계산하고 이를 통해 BlendSpace를 업데이트해줘야 한다.
    • Direction 계산은 블루프린트 노드가 있어서 간단하다.

  • 문제는 이렇게만 해주면 약 55도 정도의 오차가 생긴다. 그 이유는 CharacterMovementComponent의 Orient rotation to movement 때문이다.
  • Orient rotation to movement는 기본값이 True다. 이게 True이기 때문에 MoveRight 등에서 AddMovementInput()으로 값만 넘겨줘도 알아서 이쁘게 회전해주는 것이다. 근데 문제는 Strafe 상태일때는 이 기능이 있으면 안된다. 옆으로 움직여도 계속 앞을 봐야하기 때문이다. 그래서 LockOn을 할때마다 이 기능을 꺼줘야 한다.
GetCharacterMovement()->bOrientRotationToMovement = 0;

결과

'Coding > Devlog' 카테고리의 다른 글

#12 연속 공격 시스템 구현  (0) 2022.03.10
#11 Strafe Movement with Evade  (0) 2022.03.08
#9 스프린트 계획  (0) 2022.03.07
#8 타게팅 시스템 구현  (1) 2022.03.04
#7 기본 모드일 때, 회피 구현  (0) 2022.03.03