Bir işlevi on saniyeliğine yürütün ve iki saniyeliğine devre dışı bırakın


10

Güncelleme işlevinde çağırıyorum belirli bir işlevi var. İlk on saniye boyunca, işlev Güncelleme işlevinde çağrılmalı, daha sonra iki saniye için devre dışı bırakılmalı, sonra tekrar sonraki on saniye için etkinleştirilmelidir. Bu döngü tekrarlanmalı mı? Nasıl yürütebilirim?

Yanıtlar:


15

Alternatif olarak, modül kullanan bir astar vardır:

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()Ve %(modül) arasında bir fark var mı ? Belgelerde, "bu modulo operatörüne benzer, ancak kayan nokta sayılarıyla çalışır " , ancak modül kayan noktalarla çalışır ...
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft evet ve hayır - bildiğim kadarıyla çeşitli dillerde %operatör genellikle garip davranıyor - ya kayan nokta sayılarıyla çalışmıyor, matematik anlamında modülün çalışması için beklenmedik ya da doğrudan yanlış sonuçlar veriyor (donanımın doğasını yansıtıyor) tamsayılarda işlem). C # / mono operatörünün Repeat()tam olarak uygulanmasını arama zorunluluğundan kaçınmak için daha güvenli bir seçenek olarak seçildi %.
wondra

3
Her dilin IEEE 754 standardını uyguladığını düşündüm, ancak TIL standardının "modulo" tanımı sezgisel değildir, bu yüzden neredeyse hiçbir dil bunu uygulamamaktadır.
BlueRaja - Danny Pflughoeft

Kod üzerinden yorumu başka bir kod bloğu olarak uygularsanız ve bunları buna göre adlandırırsanız daha iyi olur.
S. Tarık Çetin

6

Aşağıdaki kodu test etmedim, ancak fikri alacaksınız:

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

Bu sadece deltaTimenispeten kısa olduğunda işe yarar . Delta daha uzunsa sleepDurationbu başarısız olur.
James Curran

sleepDuration> Time.deltaTime ise, böyle bir sisteme ihtiyacınız yoktur.
Hellium

Hayır. DeltaTime'ın 2,75 saniye olduğunu söyle. Arka arkaya 8 aktif çağrınız olması durumunda 50 saniye işaretine kadar 3 veya 4 "etkin" çağrınız, ardından bir "uyku" çağrınız olur. Ayrıca, bu senaryoda, ilk uyku çağrısı 11 saniyede gelir - zamanı 0'a sıfırlarsınız - 1'e ayarlanmalıdır.
James Curran

2
Unity'de Time.deltaTime, oyun motorunun geçerli çerçevesi ile son kare arasındaki geçen süreyi temsil eder (bu nedenle, son kullanıcı için Time.deltaTime'ın asla 2.75 saniye olmayacağını umuyorum.). Gelen bu bağlamda şunları yapabilirsiniz "bayan" fonksiyonu ya da burada bir sorun IMHO değil işlevi için -Başlangıç bir "non" çağrısı.
Hellium

4

Bunu bir program ile de yapabilirsiniz. Gibi bir şey

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.