【问题标题】:Why is the processor not waiting?为什么处理器不等待?
【发布时间】:2015-12-29 19:43:41
【问题描述】:

我正在尝试进行回合制游戏。玩家将转牌传给 IA,反之亦然。问题是,处理器运行速度太快了,有时我想做一个WaitForSeconds。在下面的示例中,我想让处理器在使用硬币之前等待 3 秒,但它只是忽略命令并转到方法 Player1Turn() 而不等待 3 秒。怎么了?

using UnityEngine;
using System.Collections;

public class Exemplo : MonoBehaviour
{
    void Update()
    {
        if (IATurn == true)
        {
            StartCoroutine(UseCoin());
            //Do some stuff
            Player1Turn();
            IATurn = false;
        }
    }

    IEnumerator UseCoin()
    {
        yield return new WaitForSeconds(3);
        MyMana--;
    }

    void Player1Turn()
    {
        //Do stuff;
    }
}

【问题讨论】:

  • 那不是yield return new WaitForSeconds(3000); 秒以毫秒为单位而不是单个整数..
  • @MethodMan 不,per the docs。这是一个浮点数秒数。
  • 然后看起来 OP 需要做yield WaitForSeconds(3); 与新的@DiegoBittencourt 阅读以下docs.unity3d.com/ScriptReference/WaitForSeconds-ctor.html
  • @MethodMan 不,您可能只是在看 Javascript 示例,但问题是关于 C#。

标签: c# unity3d seconds


【解决方案1】:

简而言之,看看你的代码流程,

在Update中执行StartCoroutine(UseCoin());,然后立即执行指针跳转到UseCoin方法,从第一行发现该行的其余部分将在3秒后执行,因此它将在3秒后返回,同时执行其余代码。

希望你能理解。

【讨论】:

  • 是的,现在我明白它是如何工作的了。我在Update() 上设置了一些条件,现在代码运行良好!谢谢大家!!!
【解决方案2】:

当您调用StartCoroutine(UseCoin()) 时,Unity 开始执行协程。一旦它到达yield return new WaitForSeconds(3);(在这种情况下是最先发生的事情!),协程就会暂时停止,控制权返回到Update。 Update 的其余部分被执行,其中包括 Player1Turn()。 3 秒后,Unity 再次启动协程:MyMana-- 被执行,协程结束。

这里的问题似乎只是您希望StartCoroutine 等到协程完成后再继续执行Update,但它并没有等待。

如果你在WaitForSeconds之后将Player1Turn();移动到协程中,它将在等待完成后发生。


请注意,Update 不必等待协程完成实际上非常有用:这意味着任何连续逻辑(如 UI 或动画)都会在游戏逻辑等待任何时间的同时继续发生必要的。如果您了解如何正确使用协程,则不必编写通常的倒计时以及 Valery 的回答所建议的那样。

【讨论】:

  • 谢谢,这对我理解协程的工作原理有很大帮助!
【解决方案3】:

我不擅长 Unity,但您似乎正在尝试做一些奇怪的事情。让我解释一下我为什么这么认为:Update 方法被调用每一帧(!),所以你的代码看起来有点奇怪(试着想象你在 Update 方法中的代码每秒调用 60 次)。对于 Unity 中的时间计数等问题,您有 Time.deltaTime (这也将使您与 fps 无关,因为它是用于帧的实时时间)-您可以在 Update 中将它们相加,并且当这个总和超过 3 秒时 - 然后执行你的逻辑。

【讨论】:

  • 完全避免协程是可行的(我在 Unity 中这样编码了一段时间,然后才意识到它们有多么有用),但我建议学习它们是如何工作的。即使你最终不喜欢它们,至少你知道额外的工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2021-05-29
相关资源
最近更新 更多