Виконайте функцію протягом десяти секунд і відключіть її на дві секунди


10

У мене є особлива функція, яку я викликаю у функції оновлення. Протягом перших десяти секунд функція повинна викликати функцію оновлення, потім її слід відключити протягом наступних двох секунд, а потім знову включити її протягом наступних десяти секунд. Цей цикл повинен постійно повторюватися? Як я можу це виконати?

Відповіді:


15

Крім того, існує одноклапник, що використовує модуль:

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
Чи є різниця між Repeat()та %(модулем)? У документації сказано, що "це схоже на оператор модуля, але він працює з числами з плаваючою комою" , але модуль працює з плаваючими ...
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft так і ні - наскільки я знаю, на різних мовах %оператор часто діє дивно - або не працює з числами з плаваючою комою, дає несподівані або прямо невірні результати для роботи модуля в його математичному значенні (відображаючи апаратну природу операція на цілі числа). Repeat()було обрано просто як більш безпечний варіант, щоб уникнути необхідності пошуку точної реалізації %оператора в C # / mono.
wondra

3
Я думав, що кожна мова реалізує стандарт IEEE 754, але визначення модуля " TIL " стандарту є неінтуїтивним, тому майже жодна мова його не реалізує.
BlueRaja - Danny Pflughoeft

Було б краще, якби ви реалізували коментар над кодом як інший блок коду і відповідно їх назвали.
S. Tarık Çetin

6

Я не перевіряв наступний код, але ви отримаєте ідею:

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

Це повинно працювати лише за deltaTimeвідносної короткості. Якщо дельта довша, sleepDurationто це не вдасться.
Джеймс Курран

якщо sleepDuration> Time.deltaTime, тоді вам не потрібна така система.
Гелій

Ні. Скажімо, дельта-час становить 2,75 секунди. У вас буде 3 або 4 "активних" дзвінка, потім один "сплячий" дзвінок, до позначки 50 секунд, коли у вас повинно бути 8 активних дзвінків поспіль. Крім того, у цьому сценарії перший дзвінок сну відбувається в 11 секунд - ви скидаєте час на 0 - його слід встановити на 1.
Джеймс Курран

2
В Unity Time.deltaTime представляє минулий час між поточним кадром ігрового двигуна і останнім кадром (таким чином, я сподіваюся для кінцевого користувача, що Time.deltaTime ніколи не буде 2,75 секунди, ....). У цьому контексті ви можете "пропустити" виклик функції або "не" -виклик до функції, що тут не є проблемою IMHO.
Гелій

4

Ви також можете зробити це за допомогою програми. Щось на зразок

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

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.