Lock on, Strafe Movement
- Lock on 상태일 때, strafe movement(게다리 걸음)가 되려면 아래 세가지가 적용돼야 한다.
- Lock on Target을 카메라(여기선 컨트롤러와 동일)가 바라봐야한다.
- 그 카메라가 바라보는 방향으로 캐릭터도 바라봐야 한다.
- 이후 움직임에 대해서 방향을 계산하고 이에 따라 적절한 애니메이션을 재생해야 한다. (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 |