দশ সেকেন্ডের জন্য একটি ফাংশন কার্যকর করুন এবং এটি দুটি সেকেন্ডের জন্য অক্ষম করুন


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
@ ব্লুরাজা-ড্যানিপ্লুঘুফুট হ্যাঁ এবং না - যতদূর আমি বিভিন্ন ভাষায় জানি %অপারেটর প্রায়শই অদ্ভুত আচরণ করে - হয় ভাসমান পয়েন্ট সংখ্যাগুলি নিয়ে কাজ করে না, তার গণিতের অর্থের মডুলাস অপারেশনের জন্য অপ্রত্যাশিত বা সরাসরি ভুল ফলাফল দেয় (এর হার্ডওয়্যার প্রকৃতির প্রতিফলন ঘটে) পূর্ণসংখ্যার উপর অপারেশন)। সি # / মনোতে অপারেটরের Repeat()যথাযথ প্রয়োগের প্রয়োজনীয়তা এড়াতে কেবল একটি নিরাপদ বিকল্প হিসাবে বেছে নেওয়া হয়েছিল %
আশ্চর্য

3
আমি ভেবেছিলাম প্রতিটি ভাষা আইইইই 754 স্ট্যান্ডার্ড বাস্তবায়িত করেছে, তবে টিআইএল স্ট্যান্ডার্ডটির "মডুলো" সংজ্ঞাটি সংজ্ঞাতীত তাই প্রায় কোনও ভাষাই এটি প্রয়োগ করে না।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

যদি আপনি মন্তব্যটির উপর কোডটিকে অন্য কোড ব্লক হিসাবে প্রয়োগ করেন এবং সে অনুযায়ী তাদের শিরোনাম করেন তবে এটি আরও ভাল।
এস তারেক

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তাহলে এই ব্যর্থ হবে।
জেমস কারান

যদি ঘুমের সময়কাল> টাইম.ডেলটাটাইম, তবে আপনার এ জাতীয় সিস্টেমের দরকার নেই।
হেলিয়াম

না। বলুন ডেল্টটাইমটি 2.75 সেকেন্ড। আপনার 50 বা দ্বিতীয় চিহ্ন পর্যন্ত 3 বা 4 "সক্রিয়" কলগুলি পরে একটি "স্লিপ" কল করতে হবে, যখন আপনার সারিতে 8 টি সক্রিয় কল থাকা উচিত। এছাড়াও, সেই দৃশ্যে, প্রথম স্লিপ কলটি 11 সেকেন্ডে আসে - আপনি সময়টি 0 এ পুনরায় সেট করেন - এটি 1 তে সেট করা উচিত
জেমস কারান

2
ইউনিটিতে, টাইম.ডেলটাটাইম গেম ইঞ্জিনের বর্তমান ফ্রেম এবং শেষ ফ্রেমের মধ্যে অতিবাহিত সময়ের প্রতিনিধিত্ব করে (এইভাবে, আমি চূড়ান্ত ব্যবহারকারীর জন্য আশা করি যে টাইম.ডেলটাটাইম কখনও কখনও ২. 2.75 সেকেন্ড হবে না, ....)। ইন এই প্রেক্ষাপটে, আপনি "মিস" ফাংশান বা একটা "অ" ডাকো ফাংশন, যা একটি বিষয় এখানে এই প্রোগ্রামটিতে নয় করার জন্য একটি কল করতে পারেন।
হিলিয়াম

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

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.