ดำเนินการฟังก์ชั่นสิบวินาทีและปิดการใช้งานเป็นเวลาสองวินาที


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
พุธที่

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นี้จะล้มเหลว
James Curran

หาก sleepDuration> Time.deltaTime แสดงว่าคุณไม่ต้องการระบบดังกล่าว
Hellium

ไม่บอกว่า deltaTime เท่ากับ 2.75 วินาที คุณจะมีการโทร 3 หรือ 4 "ที่ใช้งานอยู่" แล้วโทรหนึ่ง "หลับ" จนกระทั่งเครื่องหมาย 50 วินาทีเมื่อคุณควรมี 8 สายที่ใช้งานอยู่ในแถว ในสถานการณ์สมมตินั้นการเรียกสลีปแรกจะมาที่ 11 วินาที - คุณรีเซ็ตเวลาเป็น 0 - ควรตั้งเป็น 1
James Curran

2
ใน Unity, Time.deltaTime แสดงเวลาที่ผ่านไประหว่างเฟรมปัจจุบันของเอ็นจิ้นเกมและเฟรมสุดท้าย (ดังนั้นฉันหวังว่าสำหรับผู้ใช้ขั้นสุดท้ายที่ Time.deltaTime จะไม่เป็น 2.75 วินาที, .... ) ในบริบทนี้คุณอาจ "พลาด" การเรียกใช้ฟังก์ชันหรือ "ไม่ใช่" - โทรไปยังฟังก์ชันซึ่งไม่ใช่ปัญหาที่นี่ IMHO
Hellium

4

คุณสามารถทำได้ด้วย coroutine ด้วย สิ่งที่ต้องการ

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

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.