为什么处理器不等待?
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 到 Update
。 Update
的其余部分被执行,其中包括 Player1Turn()
。 3 秒后,Unity 再次启动协程:MyMana--
执行完毕,协程结束。
这里的问题似乎只是你希望StartCoroutine
等到协同程序完成后再继续执行Update
,但它没有等待。
如果在 WaitForSeconds
之后将 Player1Turn();
移动到协程中,它将在等待完成后发生。
请注意,Update
不必等待协程完成实际上非常有用:这意味着任何连续的逻辑,如 UI 或动画将在游戏过程中继续发生逻辑等待任何必要的时间。如果您了解如何正确使用协同程序,则不必编写通常的倒计时以及 Valery 的回答所建议的那样。
说清楚,看看你的代码流程,
在Update
中执行StartCoroutine(UseCoin());
,然后立即执行指针跳转到UseCoin
方法,从第一行开始发现其余行将在3秒后执行,所以它会在 3 秒后返回,同时执行其余代码。
希望你明白。
我正在尝试玩轮流游戏。玩家将回合传给 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 到 Update
。 Update
的其余部分被执行,其中包括 Player1Turn()
。 3 秒后,Unity 再次启动协程:MyMana--
执行完毕,协程结束。
这里的问题似乎只是你希望StartCoroutine
等到协同程序完成后再继续执行Update
,但它没有等待。
如果在 WaitForSeconds
之后将 Player1Turn();
移动到协程中,它将在等待完成后发生。
请注意,Update
不必等待协程完成实际上非常有用:这意味着任何连续的逻辑,如 UI 或动画将在游戏过程中继续发生逻辑等待任何必要的时间。如果您了解如何正确使用协同程序,则不必编写通常的倒计时以及 Valery 的回答所建议的那样。
说清楚,看看你的代码流程,
在Update
中执行StartCoroutine(UseCoin());
,然后立即执行指针跳转到UseCoin
方法,从第一行开始发现其余行将在3秒后执行,所以它会在 3 秒后返回,同时执行其余代码。
希望你明白。