我试图做一场轮流游戏。玩家将转弯转到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;
}
}
答案 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秒后返回,同时执行其余代码。
希望你明白。
答案 2 :(得分:1)
我不擅长Unity,但似乎你正试图做一些奇怪的事情。让我解释为什么我这么认为:每个帧调用Update方法(!),所以你的代码看起来有点奇怪(试着想象你的代码在Update方法中每秒调用60次)。对于Unity中的时间计数这样的问题,你有Time.deltaTime(这也会让你与fps无关,因为它是花在框架上的实际时间) - 你可以在Update中加总它们,当这个总和超过3s时 - 然后做你的逻辑。