执行一项功能十秒钟,然后禁用它两秒钟


10

我有一个要在Update函数中调用的特定函数。在最初的十秒钟内,应在Update函数中调用该函数,然后在接下来的两秒钟内禁用该功能,然后在接下来的十秒钟内再次启用它。这个周期应该不断重复吗?如何执行?

Answers:


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Çetin17年

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

否。说deltaTime为2.75秒。您将有3或4个“活动”呼叫,然后是1个“睡眠”呼叫,直到50秒标记,此时您应该连续有8个活动呼叫。此外,在该方案中,第一睡眠电话打进来了11秒-重置时间为0 -它应该被设置为1
詹姆斯·柯伦

2
在Unity中,Time.deltaTime表示游戏引擎当前帧与最后一帧之间的经过时间(因此,我希望最终用户Time.deltaTime永远不会是2.75秒,..)。在这种情况下,您可能会“错过”对函数的调用或对函数的“非”调用,恕我直言,这不是问题。
Hellium

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

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.