为什么处理器不等待?

时间:2015-12-29 19:43:41

标签: c# unity3d seconds

我试图做一场轮流游戏。玩家将转弯转到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;
    }
}

3 个答案:

答案 0 :(得分:2)

当您致电StartCoroutine(UseCoin())时,Unity开始执行协程。一旦到达yield return new WaitForSeconds(3);(在这种情况下,第一件事就会发生!),协程会暂时停止,控制权将返回Update。执行Update的其余部分,其中包括Player1Turn()。 3秒后,Unity再次启动协程:执行MyMana--并完成协程。

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

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

请注意,Update不必等待协程完成它实际上非常有用:这意味着任何连续逻辑(如UI或动画)都会在游戏中继续发生逻辑等待任何必要的时间。如果你理解如何正确使用协同程序,你就不必编写通常的倒计时,并且瓦列里的回答也是如此。

答案 1 :(得分:2)

简单来说,请查看代码流,

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

Visual

希望你明白。

答案 2 :(得分:1)

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