Ejecute una función durante diez segundos y desactívela durante dos segundos


10

Tengo una función particular que estoy llamando en la función Actualizar. Durante los primeros diez segundos, se debe llamar a la función en la función Actualizar, luego se debe deshabilitar durante los próximos dos segundos y luego volver a habilitarla durante los próximos diez segundos. Este ciclo debe seguir repitiendo? ¿Cómo puedo ejecutarlo?

Respuestas:


15

Alternativamente, hay una línea usando el módulo:

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
¿Hay alguna diferencia entre Repeat()y %(módulo)? La documentación dice "esto es similar al operador de módulo pero funciona con números de coma flotante" , pero el módulo funciona con flotantes ...
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft sí y no, por lo que sé en varios idiomas, el %operador a menudo actúa de manera extraña, o no funciona con números de coma flotante, da resultados inesperados o completamente incorrectos para la operación del módulo en su significado matemático (reflejando la naturaleza del hardware de la operación en enteros). Repeat()fue elegido como una opción más segura para evitar la necesidad de buscar la implementación exacta del %operador en C # / mono.
wondra

3
Pensé que todos los idiomas implementaban el estándar IEEE 754, pero TIL la definición de "módulo" del estándar no es intuitiva, por lo que casi ningún idioma lo implementa.
BlueRaja - Danny Pflughoeft

Sería mejor si implementara el comentario sobre el código como otro bloque de código y los titulara en consecuencia.
S. Tarık Çetin

6

No he probado el siguiente código, pero tendrás la 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 ;
    }
}

Eso solo debería funcionar si deltaTimees relativamente corto. Si el delta es más largo que sleepDurationeso, esto fallará.
James Curran

si sleepDuration> Time.deltaTime, entonces, no necesita dicho sistema.
Hellium

No. Digamos que deltaTime es de 2.75 segundos. Tendrá 3 o 4 llamadas "activas" y luego una llamada "inactiva", hasta la marca de 50 segundos, cuando debería tener 8 llamadas activas seguidas. Además, en ese escenario, la primera llamada del sueño se produce en 11 segundos - reinicie tiempo de 0 - debe ser puesto a 1.
James Curran

2
En Unity, Time.deltaTime representa el tiempo transcurrido entre el fotograma actual del motor del juego y el último fotograma (por lo tanto, espero para el usuario final que Time.deltaTime nunca será 2,75 segundos ...). En este contexto, puede "perder" una llamada a la función o una llamada "no" a la función, lo cual no es un problema aquí en mi humilde opinión.
Hellium

4

Puedes hacer esto con una corutina también. Algo como

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);
    }
  }

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.