Блокировка стрельбы при беге

Возможность стрельбы при беге смотрится нереалистично из-за нашей анимации бега, поэтому стрельбу лучше отключать при беге.

Рекомендую сначала попробовать реализовать данную логику самостоятельно, как домашнее задание.

Улучшение можно сделать после Лекции 065 или в самом конце прохождения курса.

Решение

  • Добавляем новый флаг в базовый класс оружия FireInProgress

void ASTUBaseWeapon::StartFire()
{
    FireInProgress = true;
}

void ASTUBaseWeapon::StopFire()
{
    FireInProgress = false;
}

bool ASTUBaseWeapon::IsFiring() const
{
    return FireInProgress;
}
  • В компонент оружия также добавляем функцию:

bool USTUWeaponComponent::IsFiring() const 
{ 
    return CurrentWeapon && CurrentWeapon->IsFiring(); 
}
  • В классе персонажа создаем функцию OnStartFire и биндимся на нее при стрельбе, а не напрямую, как раньше, в компонент оружия:

PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &ASTUPlayerCharacter::OnStartFire);
  • После этого добавляем код для функции OnStartFire и обновляем две другие функции:

void ASTUPlayerCharacter::OnStartFire()
{
    if (IsRunning()) return;
    WeaponComponent->StartFire();
}

...

void ASTUPlayerCharacter::OnStartRunning()
{
    WantsToRun = true;
    if (IsRunning())
    {
        WeaponComponent->StopFire();
    }
}

...

void ASTUPlayerCharacter::MoveForward(float Amount)
{
    IsMovingForward = Amount > 0.0f;
    if (Amount == 0.0f) return;
    AddMovementInput(GetActorForwardVector(), Amount);

    if (IsRunning() && WeaponComponent->IsFiring())
    {
        WeaponComponent->StopFire();
    }
}
  • Дополнительные детали с вызовом родительских функций StartFire и StopFire можно посмотреть в репозитории

Коммит в репозитории

Last updated