So in this thread @GamedevCala linked the docs page for FTimerHandler as a suggested alternative for using GetWorldTimeSeconds and FPlatformTime. I think it would be nice to switch to this instead of the two aforementioned methods. Here is the replacement code needed
in TankAimingComponent.h add FTimerHandle ReloadTimerHandle;
and then in the following changes in the .cpp
void UTankAimingComponent::BeginPlay()
{
//delegate function to be called when timer finishes
FTimerDelegate
//bind a lambda function to the delegate
Delegate.BindLambda([=] { FiringState = EFiringState::Locked; });
GetWorld()->GetTimerManager().SetTimer(ReloadTimerHandle, Delegate, ReloadTimeInSeconds, false);
}
void UTankAimingComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
{
bool isReloading = GetWorld()->GetTimerManager().IsTimerActive(ReloadTimerHandle);
if (!isReloading)
{
if (IsBarrelMoving())
{
FiringState = EFiringState::Aiming;
}
else
{
FiringState = EFiringState::Locked;
}
}
}
void UTankAimingComponent::Fire()
{
bool isReloading = GetWorld()->GetTimerManager().IsTimerActive(ReloadTimerHandle);
if (!isReloading)
{
FiringState = EFiringState::Reloading;
// Spawn a projectile at the socket location on the barrel
if (!ensure(Barrel)) { return; }
if (!ensure(ProjectileBlueprint)) { return; }
auto Projectile = GetWorld()->SpawnActor<AProjectile>(
ProjectileBlueprint,
Barrel->GetSocketLocation(FName("Projectile")),
Barrel->GetSocketRotation(FName("Projectile"))
);
Projectile->LaunchProjectile(LaunchSpeed);
FTimerDelegate Delegate;
Delegate.BindLambda([=] { FiringState = EFiringState::Locked; });
GetWorld()->GetTimerManager().SetTimer(ReloadTimerHandle, Delegate, ReloadTimeInSeconds, false);
}
}
Edit: wow, thats a lot of wasted space on the right making the code box really small . Also I coded most of this before I did the IsBarrelMoving part, so realistically you could use the SetTimer which doesn’t take a delegate since Locked should be set in the tick function so it’s not really needed, but I guess it’s useful knowing you can pass one in and sort of how to do so.