Eseguire una funzione per dieci secondi e disabilitarla per due secondi


10

Ho una funzione particolare che sto chiamando nella funzione di aggiornamento. Per i primi dieci secondi, la funzione dovrebbe essere chiamata nella funzione di aggiornamento, quindi dovrebbe essere disabilitata per i prossimi due secondi, quindi abilitarla di nuovo per i prossimi dieci secondi. Questo ciclo dovrebbe continuare a ripetersi? Come posso eseguirlo?

Risposte:


15

In alternativa, esiste un one-liner che utilizza il modulo:

void Update()
{
    //if you want it loop from specific start time rather than from start of the game, 
    //subtract said time value from Time.time argument value
    if(Mathf.Repeat(Time.time, execDuration + sleepDuration) < execDuration)
        executeFunction();
}

1
C'è una differenza tra Repeat()e %(modulo)? La documentazione dice "questo è simile all'operatore modulo ma funziona con numeri in virgola mobile" , ma il modulo funziona con float ...
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft sì e no - per quanto ne so in varie lingue l' %operatore agisce spesso in modo strano - o non funziona con numeri in virgola mobile, dà risultati inattesi o totalmente errati per il funzionamento del modulo nel suo significato matematico (che riflette la natura hardware di l'operazione sugli interi). Repeat()è stato scelto proprio come un'opzione più sicura per evitare la necessità di cercare l'esatta implementazione %dell'operatore in C # / mono.
Wondra,

3
Pensavo che ogni linguaggio implementasse lo standard IEEE 754, ma TIL la definizione "modulo" dello standard non è intuitiva, quindi quasi nessun linguaggio lo implementa.
BlueRaja - Danny Pflughoeft

Sarebbe meglio se implementassi il commento sul codice come un altro blocco di codice e li intitolassi di conseguenza.
S. Tarık Çetin,

6

Non ho testato il seguente codice, ma otterrai l'idea:

public float wakeUpDuration = 10.0f ;
public float sleepDuration = 2.0f;
private bool callFunction = true ;
private float time = 0 ;

void Update()
{
    time += Time.deltaTime;
    if( callFunction )
    {
         if( time >= wakeUpDuration )
         {
             callFunction = false;
             time = 0 ;
         }
         else
         {
             foo(); // Your function
         }
    }
    if( !callFunction && time >= sleepDuration )
    {
        callFunction = true;
        time = 0 ;
    }
}

Ciò dovrebbe funzionare solo se deltaTimeè relativamente breve. Se il delta è più lungo di sleepDurationallora, ciò fallirà.
James Curran,

se sleepDuration> Time.deltaTime, quindi, non è necessario tale sistema.
Hellium,

No. Supponiamo che deltaTime sia 2,75 secondi. Avrai 3 o 4 chiamate "attive", quindi una chiamata "inattiva", fino al segno di 50 secondi, quando dovresti avere 8 chiamate attive di fila. Inoltre, in quello scenario, la prima chiamata di sleep arriva a 11 secondi - reimposta il tempo a 0 - dovrebbe essere impostato su 1.
James Curran

2
In Unity, Time.deltaTime rappresenta il tempo trascorso tra il frame corrente del motore di gioco e l'ultimo frame (quindi, spero per l'utente finale che Time.deltaTime non sarà mai di 2,75 secondi, ....). In questo contesto, è possibile "perdere" una chiamata alla funzione o una chiamata "non" alla funzione, che qui non rappresenta un problema.
Hellium,

4

Puoi farlo anche con una procedura di routine. Qualcosa di simile a

public class Comp : MonoBehaviour
{
  private bool _shouldCall;

  Start() 
  {
    StartCoroutine(UpdateShouldCall)
  }

  Update() 
  {
    if(_shouldCall)
        CallTheFunction();
  }

  IEnumerator UpdateShouldCall()
  {
    while(true) 
    {
        _shouldCall = true;
        yield return new WaitForSeconds(10);
        _shouldCall = false;
        yield return new WaitForSeconds(2);
    }
  }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.