为什么处理器不等待?

Why is the processor not waiting?

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

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

我不擅长 Unity,但你似乎想做一些奇怪的事情。让我解释一下我为什么这么认为:Update 方法每帧调用一次(!),因此您的代码看起来有点奇怪(尝试想象您的代码在 Update 方法中每秒调用 60 次)。对于像 Unity 中的时间计数这样的问题,你有 Time.deltaTime(这也会让你 fps-independent,因为它是花在帧上的实时时间)——你可以在 Update 中对它们求和,当这个总和超过3s - 然后做你的逻辑。

当你调用StartCoroutine(UseCoin())时,Unity开始执行协程。一旦达到 yield return new WaitForSeconds(3);(在本例中是发生的第一件事!)协程将暂时停止并控制 returns 到 UpdateUpdate 的其余部分被执行,其中包括 Player1Turn()。 3 秒后,Unity 再次启动协程:MyMana-- 执行完毕,协程结束。

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

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


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

说清楚,看看你的代码流程,

Update中执行StartCoroutine(UseCoin());,然后立即执行指针跳转到UseCoin方法,从第一行开始发现其余行将在3秒后执行,所以它会在 3 秒后返回,同时执行其余代码。

希望你明白。