C# 在更新方法中每X秒消耗一次设定值

C# 在更新方法中每X秒消耗一次设定值,c#,unity3d,C#,Unity3d,我想在更新方法中每隔1秒从设置值中消耗一次生命值。我写的代码,但它似乎消耗速度超过1秒 在更新方法中,我调用: if (Hunger <= 0.0f) { userHealth -= HealthDepletionValue * Time.deltaTime; } if(Hunger如中所述,Update()每帧运行一次。因此,如果您的游戏每秒运行30帧,则Update()将每秒执行30次 要指定每x秒执行一次的函数,可以使用。为此,请将每秒要执行的逻辑放入它自己的方法中: vo

我想在更新方法中每隔1秒从设置值中消耗一次生命值。我写的代码,但它似乎消耗速度超过1秒

在更新方法中,我调用:

if (Hunger <= 0.0f)
{
    userHealth -= HealthDepletionValue * Time.deltaTime;
}
if(Hunger如中所述,Update()每帧运行一次。因此,如果您的游戏每秒运行30帧,则Update()将每秒执行30次

要指定每x秒执行一次的函数,可以使用。为此,请将每秒要执行的逻辑放入它自己的方法中:

void DepleteHealth()
{
    if (Hunger <= 0.0f)
    {
        userHealth -= HealthDepletionValue * Time.deltaTime;
    }
}


上面的文章还展示了处理此问题的其他方法。包括在Update()方法中跟踪第二个计数器,以确保只有在计数器已过一整秒时才执行您的逻辑。

调用重复的另一个选项是创建您自己的计时器

float timer = 0;

Update()
{
  if (Hunger <= 0.0f)
  {
    timer += time.deltaTime;
    if (timer > 1f){
        userHealth -= HealthDepletionValue;
        timer = 0; //reset timer
    }
  }
}
float定时器=0;
更新()
{
如果(1f){
userHealth-=HealthDrupationValue;
计时器=0;//重置计时器
}
}
}

或者,您可以使用a和类


这可能非常简单。

如果您能提供一个。例如,显示
userHealth
的值和类型以及其他变量,那就太棒了。@mjwills让我们假设
userHealth
值为1。但是我正在调试这个问题,似乎Time.deltaTime返回的值介于0.1和0.3之间。这种情况使ense为什么它现在对我不起作用。如果bool设置为true,我怎么能每1秒耗尽一次呢?使用InvokeRepeating。@Arthuberkin查看更新的答案,并举例说明这将如何使用donethanks mate,这是有效的。出于某种原因,如果我在Start方法末尾调用了InvokeRepeat,它就不起作用了。你会知道为什么吗?因为这对我来说毫无意义。
float timer = 0;

Update()
{
  if (Hunger <= 0.0f)
  {
    timer += time.deltaTime;
    if (timer > 1f){
        userHealth -= HealthDepletionValue;
        timer = 0; //reset timer
    }
  }
}
public void Start () {
    StartCoroutine(DepleteHealth(TimeSpan.FromSeconds(1), 5));
}

public IEnumerator DepleteHealth (TimeSpan frequency, int loss) {
   var wait = new WaitForSeconds((float)frequency.TotalSeconds());
   while(true) {
        userHealth -= loss;
        yield return wait;
   }
}