Unity:Wait()在更新中几乎正常工作(但不完全)

时间:2017-02-15 16:02:00

标签: c# unity3d wait

我有一个带有更新功能的代码(C#),需要在某个时刻等待几秒钟。问题在于,当它正在执行wait命令时,它会继续执行更新功能,从而导致应该被延迟的位被完全跳过。 由于布尔变量,更新只会执行一次这样的操作,直到我再次使用它,这样就没问题了。 代码在没有整个等待的情况下工作,所以不要担心,我遗漏了大多数与等待无关的行。

void Update()
{

    if (RoundOver == false)
    {
        RoundOver = true;
        Seconds = 3;
        Debug.Log("Waiting", gameObject);
        StartCoroutine(Wait());
        if (Continue)
        {
            Continue = false;
            Debug.Log("Done Waiting", gameObject);
            RoundNumber += 1;                //Just game stuff
            ZombiesLeft = ZombieAmount();    //Just game stuff
            RoundOver = false;
        }
        Debug.Log("Done wit stuff", gameObject);
    }
    if (counter > DelayTime && RoundOver == false)
    {
        counter = 0;
        Debug.Log("Going to spawn a zombie", gameObject);
        SpawnZombie();
    }
    counter += Time.deltaTime;
    }

with les wait功能:

IEnumerator Wait()
{
    Debug.Log("ACTUALLY WAITING", gameObject);
    yield return new WaitForSeconds(Seconds);
    Continue = true;
    Debug.Log("ACTUALLY WAITING DONE", gameObject);
}

输出如下:

Waiting
ACTUALLY WAITING
Done wit stuff
ACTUALLY WAITING DONE

显然正确的顺序应该是

Waiting
ACTUALLY WAITING
ACTUALLY WAITING DONE
Done wit stuff

编辑: if (continue)中的块应该在满足(此处隐藏)要求时激活第二个块。第二个块将继续执行其操作直到完成(可能需要几分钟),然后将RoundOver设置为false再次重新启用第一个块。第一个块基本上是继续使用增加的变量(如RoundNumber +=1重新运行第二个块,并且这是唯一的问题,将第二个块隔开3秒。

3 个答案:

答案 0 :(得分:1)

您不能在Update函数中等待,只能在返回IEnumerator的函数中等待。

为此你可以做这样的事情

void Update()
{
   if (RoundOver == false)
   {
        RoundOver = true;
        StartCoroutine(Wait());
   }
   if (counter > DelayTime && RoundOver == false)
   {
    counter = 0;
    Debug.Log("Going to spawn a zombie", gameObject);
    SpawnZombie();
   }
   counter += Time.deltaTime;
}

IEnumerator Wait()
{
    Seconds = 3;
    Debug.Log("Waiting", gameObject);
    Debug.Log("ACTUALLY WAITING", gameObject);
    yield return new WaitForSeconds(Seconds);
    Debug.Log("Done Waiting", gameObject);
    RoundNumber += 1;                //Just game stuff
    ZombiesLeft = ZombieAmount();    //Just game stuff
    RoundOver = false;
    Debug.Log("ACTUALLY WAITING DONE", gameObject);
    Debug.Log("Done wit stuff", gameObject);
}

虽然这不是最干净的东西,但如果可能的话,我会删除Update中的所有代码并在需要时启动协程。

答案 1 :(得分:1)

我通过将void SpawnZombie()转换为IEnumerator而不是单独的Wait()来解决这个问题。然后,我将SpawnZombie()替换为StartCoroutine(SpawnZombie())。为了让它像我想要的那样,我在if中添加了SpawnZombie(),以确保只在我想要的时候才会等待3秒。

答案 2 :(得分:0)

您的调试语句Debug.Log("Done wit stuff", gameObject);超出了if语句if (Continue)。因此,即使协程仍在运行,它也会显示。