दस सेकंड के लिए एक फ़ंक्शन निष्पादित करें और इसे दो सेकंड के लिए अक्षम करें


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()और %मापांक) में अंतर है ? प्रलेखन का कहना है "यह
मोडुलो

1
@ BlueRaja-DannyPflughoeft हाँ और नहीं - जहाँ तक मुझे पता है कि विभिन्न भाषाओं में %ऑपरेटर अक्सर अजीब तरह से कार्य करता है - या तो फ़्लोटिंग पॉइंट नंबरों के साथ काम नहीं करता है, इसके गणित अर्थ में मापांक ऑपरेशन के लिए अप्रत्याशित या एकमुश्त गलत परिणाम देता है (हार्डवेयर प्रकृति को दर्शाता है) पूर्णांक पर ऑपरेशन)। सी # / मोनो में ऑपरेटर के Repeat()सटीक कार्यान्वयन की आवश्यकता से बचने के लिए सिर्फ एक सुरक्षित विकल्प के रूप में चुना गया था %
वंड्रा

3
मैंने सोचा था कि हर भाषा IEEE 754 मानक को लागू करती है, लेकिन TIL मानक की "मोडुलो" परिभाषा अचूक है, इसलिए लगभग कोई भी भाषा इसे लागू नहीं करती है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

बेहतर होगा कि आप कोड पर टिप्पणी को दूसरे कोड ब्लॉक के रूप में लागू करें और उनके अनुसार शीर्षक दें।
एस। तारिक inटीन

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तो यह विफल हो जाएगा।
जेम्स क्यूरन

यदि नींद की अवधि> Time.deltaTime, तो, आपको ऐसी प्रणाली की आवश्यकता नहीं है।
हेलियम जू

नं। कहो डेल्टा २. is५ सेकंड है। आपके पास 3 या 4 "सक्रिय" कॉल हैं, फिर एक "नींद" कॉल, 50 सेकंड के निशान तक, जब आपके पास एक पंक्ति में 8 सक्रिय कॉल होना चाहिए। इसके अलावा, उस स्थिति में, पहली नींद कॉल 11 सेकंड में आती है - आप समय को 0 पर रीसेट करते हैं - इसे 1 पर सेट किया जाना चाहिए
जेम्स क्यूरन

2
एकता में, Time.deltaTime गेम इंजन के वर्तमान फ्रेम और अंतिम फ्रेम के बीच बीता समय का प्रतिनिधित्व करता है (इस प्रकार, मैं अंतिम उपयोगकर्ता के लिए आशा करता हूं कि Time.deltaTime कभी भी 2.75 सेकंड, ....) नहीं होगी। में इस संदर्भ में, आप "याद आती है" समारोह या एक "गैर" -call समारोह है, जो एक मुद्दा यहाँ 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.