我有一个带有更新功能的代码(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秒。
答案 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)
。因此,即使协程仍在运行,它也会显示。