Jalankan fungsi selama sepuluh detik dan nonaktifkan selama dua detik


10

Saya memiliki fungsi tertentu yang saya panggil dalam fungsi Perbarui. Selama sepuluh detik pertama, fungsi tersebut harus dipanggil dalam fungsi Perbarui, lalu harus dinonaktifkan selama dua detik berikutnya, lalu aktifkan kembali selama sepuluh detik berikutnya. Siklus ini harus terus berulang? Bagaimana saya bisa menjalankannya?

Jawaban:


15

Atau, ada satu-liner menggunakan modulus:

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
Apakah ada perbedaan antara Repeat()dan %(modulus)? Dokumentasi mengatakan "ini mirip dengan operator modulo tetapi ia bekerja dengan angka floating point" , tetapi modulus bekerja dengan pelampung ...
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft ya dan tidak - sejauh yang saya tahu dalam berbagai bahasa, %operator sering bertingkah aneh - keduanya tidak bekerja dengan angka floating point, memberikan hasil yang tidak terduga atau langsung salah untuk operasi modulus dalam arti matematika (mencerminkan sifat perangkat keras dari operasi pada bilangan bulat). Repeat()dipilih hanya sebagai opsi yang lebih aman untuk menghindari keharusan mencari implementasi yang tepat dari %operator di C # / mono.
wondra

3
Saya pikir setiap bahasa menerapkan standar IEEE 754, tetapi TIL definisi "modulo" standar tidak intuitif sehingga hampir tidak ada bahasa yang mengimplementasikannya.
BlueRaja - Danny Pflughoeft

Akan lebih baik jika Anda menerapkan kode komentar di atas sebagai blok kode lain dan memberi judul sesuai.
S. Tarık Çetin

6

Saya belum menguji kode berikut, tetapi Anda akan mendapatkan idenya:

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

Itu seharusnya hanya berfungsi jika deltaTimerelatif singkat. Jika delta lebih panjang dari sleepDurationini akan gagal.
James Curran

jika sleepDuration> Time.deltaTime, maka, Anda tidak perlu sistem seperti itu.
Hellium

Tidak. Katakan deltaTime adalah 2,75 detik. Anda akan memiliki 3 atau 4 panggilan "aktif" lalu satu panggilan "tidur", hingga tanda 50 detik, ketika Anda seharusnya memiliki 8 panggilan aktif berturut-turut. Juga, dalam skenario itu, panggilan tidur pertama datang pada 11 detik - Anda mengatur ulang waktu ke 0 - harus diatur ke 1.
James Curran

2
Di Unity, Time.deltaTime mewakili waktu yang telah berlalu antara kerangka saat ini dari mesin permainan dan kerangka terakhir (dengan demikian, saya berharap bagi pengguna akhir bahwa Time.deltaTime tidak akan pernah menjadi 2,75 detik, ....). Dalam konteks ini , Anda dapat "melewatkan" panggilan ke fungsi atau "non" -call ke fungsi, yang bukan merupakan masalah di sini IMHO.
Hellium

4

Anda dapat melakukan ini dengan coroutine juga. Sesuatu seperti

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

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.