2023.03.27 ~ 2023.04.02 개발일지
before
if (MovementVector.Size() < 2)
AddMovementInput(ScaledMovementInput);
else
AddMovementInput(ScaledMovementInput, MovementVector.Size() / 50);
after
if (CurrentInputType == ECommonInputType::MouseAndKeyboard)
AddMovementInput(ScaledMovementInput);
else if (CurrentInputType == ECommonInputType::Gamepad)
AddMovementInput(ScaledMovementInput, ((MovementVector.Size() / 50) < 0.7f) ? 0.4f : 1.0f);
before
void AIFCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// stops Sprint once character is slowed down
// 속도가 줄어들때 call 되는 함수를 찾아보자.. Tick 에 넣는거 너무 느낌 없다
if (GetVelocity().Size() <= 400.0f)
GetCharacterMovement()->MaxWalkSpeed = 400.0f;
}
void AIFCharacter::SprintStart()
{
if (GetCharacterMovement()->MaxWalkSpeed != 600.0f)
{
GetCharacterMovement()->MaxWalkSpeed = 600.0f;
}
}
after
void AIFCharacter::SprintStart()
{
if (GetCharacterMovement()->MaxWalkSpeed != 600.0f)
{
GetCharacterMovement()->MaxWalkSpeed = 600.0f;
}
}
void AIFCharacter::SprintEnd()
{
GetCharacterMovement()->MaxWalkSpeed = 400.0f;
}
이때 Sprint 방식은 Enhanced Input에서 Hold의 방식으로 변경했다
before
많았던 노티파이를
after
한가지로 줄였다
또 DrawEnd
, SheatheEnd
처럼 같은 기능을 하지만 달랐던 네이밍을 CanDoNextAction
으로 통일하였다
UIFCharacterAnimInstance::UIFCharacterAnimInstance()
{
...
OnMontageStarted.AddDynamic(this, &UIFCharacterAnimInstance::DrawStateStart);
OnMontageStarted.AddDynamic(this, &UIFCharacterAnimInstance::CanDoNextActionFalse);
OnMontageEnded. AddDynamic(this, &UIFCharacterAnimInstance::DrawStateEnd);
}
void UIFCharacterAnimInstance::PlayParryingMontage()
{
if(bCanDoNextAction)
Montage_Play(ParryingMontage);
}
void UIFCharacterAnimInstance::DrawStateStart(UAnimMontage* Montage)
{
if (Montage == SheatheMontage)
bIsDrawState = false;
}
void UIFCharacterAnimInstance::CanDoNextActionFalse(UAnimMontage* Montage)
{
bCanDoNextAction = false;
}
void UIFCharacterAnimInstance::AnimNotify_CanDoNextActionTrue()
{
bCanDoNextAction = true;
}
void UIFCharacterAnimInstance::DrawStateEnd(UAnimMontage* Montage, bool bInterrupted)
{
// Only Set true when the montage is fully played
if (Montage == DrawMontage && !bInterrupted)
bIsDrawState = true;
}
언리얼5에서는 원시 포인터 대신 TObjectPtr 사용을 권장하기 때문에 바꿔주었다
(참고) https://docs.unrealengine.com/5.0/ko/unreal-engine-5-migration-guide/
Block 모션을 통해 블랜드 스페이스를 만들어주고,
스테이트 머신을 통해 Block State에서 움직이도록 구현하였다
블락 기능은 Q를 통해 진입이 가능한데, q를 2번 누르면 패링이 가능하도록 구현했다 (God of War와 동일하게 작동하는데 초점)
2번 누르는 기능은 Enhanced Input
의 Combo
기능을 통해 구현했다
패링 모션은 루트 모션을 설정하고, 키값을 통해 살짝 전진하는 느낌을 주었다
다음은 패링 모션을 몽타주로 설정하고, 슬롯을 UpperBody로 추가시켰다
지금까지 만들었던 애니메이션을 다시 캐시로 저장하고, 상체를 사용하는 Montage와 블랜딩하였다
현재까지의 모습은 이러하다