Execute uma função por dez segundos e desative-a por dois segundos

10

Eu tenho uma função específica que estou chamando na função Update. Nos primeiros dez segundos, a função deve ser chamada na função Atualizar, desativada pelos próximos dois segundos e ativá-la novamente pelos próximos dez segundos. Este ciclo deve continuar se repetindo? Como posso executá-lo?

MrRobot9
fonte

Respostas:

15

Como alternativa, existe uma linha usando o 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();
}
wondra
fonte
1
Existe uma diferença entre Repeat()e %(módulo)? A documentação diz "isso é semelhante ao operador do módulo, mas funciona com números de ponto flutuante" , mas o módulo funciona com flutuadores ...
BlueRaja - Danny Pflughoeft 7/17 /
1
@ BlueRaja-DannyPflughoeft sim e não - até onde eu sei em vários idiomas, o %operador geralmente age de maneira estranha - ou não funciona com números de ponto flutuante, fornece resultados incorretos inesperados ou definitivos para a operação do módulo em seu significado matemático (refletindo a natureza do hardware de a operação em números inteiros). Repeat()foi escolhido apenas como uma opção mais segura para evitar a necessidade de procurar a implementação exata do %operador em C # / mono.
Wondra
3
Eu pensei que todas as linguagens implementavam o padrão IEEE 754, mas até a definição de "módulo" do padrão não é intuitiva, então quase nenhuma linguagem o implementa.
BlueRaja - Danny Pflughoeft
Seria melhor se você implementasse o comentário sobre o código como outro bloco de código e os intitulasse de acordo.
S. Tarık Çetin
6

Não testei o código a seguir, mas você entenderá:

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 ;
    }
}
Hellium
fonte
Isso só deve funcionar se deltaTimefor relativamente curto. Se o delta for maior que sleepDurationisso, isso falhará.
James Curran
se sleepDuration> Time.deltaTime, você não precisará desse sistema.
Hellium 7/07
Não. Digamos que deltaTime seja 2,75 segundos. Você terá 3 ou 4 chamadas "ativas" e, em seguida, uma chamada "inativa", até a marca de 50 segundos, quando você deve ter 8 chamadas ativas seguidas. Além disso, nesse cenário, a primeira chamada sono vem em 11 segundos - você redefinir tempo para 0 - deve ser definido como 1.
James Curran
2
No Unity, Time.deltaTime representa o tempo decorrido entre o quadro atual do mecanismo de jogo e o último quadro (portanto, espero que, para o usuário final, o Time.deltaTime nunca tenha 2,75 segundos, ....). No presente contexto, você pode "perder" uma chamada para a função ou um "não" -chamar para a função, que não é um problema aqui IMHO.
Hellium 7/07
4

Você pode fazer isso com uma rotina também. 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);
    }
  }

}
Sava B.
fonte