機能を10秒間実行し、2秒間無効にする


10

Update関数で呼び出す特定の関数があります。最初の10秒間、この関数はUpdate関数で呼び出され、次に2秒間無効になり、その後再び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 yes and no-私が知っている限り、%演算子は奇妙に振る舞うことがよくあります-浮動小数点数では機能せず、数学的な意味でのモジュラス演算に予期しないまたはまったく間違った結果を与えます(ハードウェアの性質を反映しています)整数の演算)。C#/ mono Repeat()%演算子の正確な実装を調べる必要を回避するために、より安全なオプションとして選択されました。
ウォンドラ2017年

3
すべての言語がIEEE 754標準を実装していると思いましたが、TIL 標準の「モジュロ」定義は直感的ではないため、ほとんどの言語で実装されていません。
BlueRaja-Danny Pflughoeft 2017年

コードに対するコメントを別のコードブロックとして実装し、それに応じてタイトルを付けた方がよいでしょう。
S.TarıkÇetin2017

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 2017年

sleepDuration> Time.deltaTimeの場合、そのようなシステムは必要ありません。
ヘリウム2017年

いいえ。deltaTimeは2.75秒です。あなたは3つまたは4つの「アクティブな」呼び出し、そして1つの「スリープ」呼び出しを持ち、50秒のマークになるまで、続けて8つのアクティブな呼び出しを持つべきです。また、そのシナリオでは、最初の睡眠コールは11秒で来る-あなたは0にリセット時間-それは1に設定する必要があります
ジェームズ・カラン

2
Unityでは、Time.deltaTimeは、ゲームエンジンの現在のフレームと最後のフレームの間の経過時間を表します(したがって、Time.deltaTimeが2.75秒になることはありません....)。では、このコンテキストでは、あなたかもしれない「ミス」機能やここでの問題私見ではない機能に-call「非」のコール。
ヘリウム2017年

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.