当应用程序未处于焦点或其他选项卡中时,WaitForSeconds停止工作

时间:2017-10-12 01:26:56

标签: c# unity3d background coroutine

我用Unity制作了WebGL游戏。每一帧都不需要进行一些计算,因此我将它们放在一个协程中。但是当游戏处于后台时,协同程序的工作速度比正常情况慢,并且等待额外的5-10秒。

例如,士兵跑向我,我向他们发射子弹以杀死他们。当他们进入射程时,他们也开始射击。我检查了敌人是否在与协程的范围内。当我在浏览器上看到其他标签时,一些敌人比正常情况更接近,有些人会通过游戏画面。这使得游戏无法播放。

有没有办法让协同程序正常工作,或者我需要将每个计算都放到更新方法中?

示例代码是:

private IEnumerator ActionDeciderCoroutine()
{
    while (true)
    {
        DoAction();
        yield return new WaitForSeconds(Constants.ENEMY_THINKING_TIME);
    }
}

1 个答案:

答案 0 :(得分:1)

Coroutine不是“奇怪地”行事。使用WaitForSeconds是问题,这就是为什么我改变了这个问题的标题。当您希望等待或计时器在Unity没有焦点或在另一个选项卡中时停止计数时,将使用WaitForSeconds yield指令。如果有焦点或者如果使用WebGL返回选项卡,它将恢复。

相反的是WaitForSecondsRealtime当您希望等待或计时器正常继续时使用,即使应用程序没有焦点,甚至在另一个标签中也是如此。它使用未缩放的功能。在您的情况下,您需要使用WaitForSecondsRealtime yield指令。

private IEnumerator ActionDeciderCoroutine()
{
    while (true)
    {
        DoAction();
        yield return new WaitForSecondsRealtime(Constants.ENEMY_THINKING_TIME);
    }
}