Kannst du den kompletten Output Log posten?
Ansonsten ist aber hier der Timer sinnlos. Da du so oder so in Endeffekt jeden Tick die Funktion Flicker und RandonNumber ausführst, außer in den ersten 0.3 Sekunden. Der Timer ist also nicht notwending und nur resourcen verschwendung.
Mal ein Beispiel fürs loopen:
void ABRSWeapon::TimeWeaponRefire()
{
GetWorldTimerManager().SetTimer(this, &ABRSWeapon::TryRefire, FireModes[CurrentFireMode].FireInterval, true);
}
Dies ist die funktion die bei MouseDown aufgerufen wird (natürlich nicht direkt und erst nach ziemlich vielen Prüfungen). Diese sorgt dafür, dass eine Waffe immer wieder feuert. Außer der Timer wird gestoppt (wenn die Maustaste losgelassen wird.)
Hier könnte man auch den Timer immer wieder in TryRefire() neu starten. Jedoch würde das bedeuten dass sich dieser Timer erst zerstört nur um dann wieder neu erstellt zu werden. Effizienter ist es daher wie hier in TryRefire einfach den Timer zu stoppen, wenn er nicht mehr gebraucht wird.
void ABRSWeapon::EquipWeapon()
{
// If Server then notify clients about this. If called on Client or in SinglePlayer SimulateEquip
if (Role == ROLE_Authority && !(GetWorld()->GetNetMode() == ENetMode::NM_Standalone))
{
Multicast_EquipWeapon();
}
else
{
SimulateEquip();
}
WeaponState = EWeaponState::Equipping;
GetWorldTimerManager().SetTimer(this, &ABRSWeapon::WeaponEquipped, FMath::Max(EquipTime, 0.01f), false);
}
void ABRSWeapon::WeaponEquipped()
{
GetWorldTimerManager().ClearTimer(this, &ABRSWeapon::WeaponEquipped);
UE_LOG(LogInventory, Log, TEXT("%s is now active!"), *GetName());
WeaponState = EWeaponState::Active;
// if weapon change is pending start it.
if (bPendingUnequip)
{
UnequipWeapon();
return;
}
for (int32 i = 0; i < FireModes.Num(); i++)
{
if (IsPendingFire(i))
{
FireWeapon(i);
break;
}
}
}
Alles anzeigen
Hier geht es um das Ausrüsten einer Waffe. Der Timer wird diese Mal nur einmal ausgeführt, da nach dem Ausrüsten dieser Timer nicht mehr gebraucht wird.