c# - 当应用程序未处于焦点或位于另一个选项卡中时,WaitForSeconds 停止工作

标签 c# unity-game-engine background coroutine

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

例如,士兵跑向我,我向他们发射子弹以杀死他们。当他们进入射程时,他们也会开火。我检查了敌人是否在协程范围内。当我进入浏览器上的其他选项卡时,一些敌人比平常更接近,而一些敌人则来到并经过游戏屏幕。这使得游戏无法玩。

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

示例代码是:

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

最佳答案

协程的行为并不“奇怪”。使用 WaitForSeconds 是问题所在,这就是我更改此问题标题的原因。 WaitForSeconds当您希望等待或计时器在 Unity 没有焦点或位于另一个选项卡中时停止计数时,请使用yield 指令。当有焦点时或当您返回选项卡(如果使用 WebGL)时,它将恢复。

相反的是WaitForSecondsRealtime当您希望等待或计时器正常继续时使用,即使应用程序没有焦点或者即使在另一个选项卡中也是如此。它使用未缩放的函数。在您的情况下,您需要使用 WaitForSecondsRealtime Yield 指令。

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

关于c# - 当应用程序未处于焦点或位于另一个选项卡中时,WaitForSeconds 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46699960/

相关文章:

c# - 保存/创建/导出 Excel 工作表时出现 OutOfMemoryException

c# - 如何在 .net 中有条件地继承类

memory - 从unity3d中的url异步获取图像

c# - Unity 5 UI - 分配 Dropdown.value 导致崩溃

ios - 无法处理背景音频的远程控制事件

c# - 如何从pdb读取源路径

c# - LINQ Distinct with EqualityComparer<T>.Default : IEquatable<T> implementation ignored?

c# - 为什么我不能两次更改 bool 值?

Javascript 随机背景右上固定

html - 相邻背景色 div 之间不需要的 "margin"