Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当应用程序不在焦点或其他选项卡中时,WaitForSeconds停止工作_C#_Unity3d_Background_Coroutine - Fatal编程技术网

C# 当应用程序不在焦点或其他选项卡中时,WaitForSeconds停止工作

C# 当应用程序不在焦点或其他选项卡中时,WaitForSeconds停止工作,c#,unity3d,background,coroutine,C#,Unity3d,Background,Coroutine,我用Unity制作了WebGL游戏。有些计算不是每一帧都需要的,所以我把它们放在一个协同程序中。但当游戏处于后台时,协同程序的工作速度比正常情况下慢,需要额外等待5-10秒 例如,士兵们向我跑来,我向他们开枪杀死他们。当他们进入射程时,他们也开始开火。我检查了敌人是否在协同作战的射程内。当我在浏览器的其他选项卡上移动时,一些敌人会比正常情况下更靠近,一些敌人会出现并通过游戏屏幕。这使得游戏无法播放 有没有一种方法可以使协同程序正常工作,或者我需要把每一个计算都放到更新方法中 示例代码为: pri

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

例如,士兵们向我跑来,我向他们开枪杀死他们。当他们进入射程时,他们也开始开火。我检查了敌人是否在协同作战的射程内。当我在浏览器的其他选项卡上移动时,一些敌人会比正常情况下更靠近,一些敌人会出现并通过游戏屏幕。这使得游戏无法播放

有没有一种方法可以使协同程序正常工作,或者我需要把每一个计算都放到更新方法中

示例代码为:

private IEnumerator ActionDeciderCoroutine()
{
    while (true)
    {
        DoAction();
        yield return new WaitForSeconds(Constants.ENEMY_THINKING_TIME);
    }
}
科鲁廷的行为并不“奇怪”。使用
WaitForSeconds
是问题所在,这就是我更改此问题标题的原因。当Unity没有焦点或在另一个选项卡中时,希望等待或计时器停止计数时,使用yield指令。当有焦点或使用WebGL返回到选项卡时,它将恢复

相反,当您希望等待或计时器正常继续时,即使应用程序没有焦点,或者即使在另一个选项卡中,也可以使用此选项。它使用无标度函数。在您的情况下,需要使用
waitforsecondrealtime
yield指令

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

我的建议是:不要使用协同程序。如何在协同程序中检查敌人的射程?你能给我们一些代码来说明这一点吗
Update()
函数的作用与coroutine所做的几乎相同,更改为
Update()
应该没有任何区别。如果您在播放器设置中选中了“后台运行”,则选中了“后台运行”设置。若我取消选中它,那个就并没有问题了,但我需要在后台玩游戏。不幸的是,这也不能解决我的问题。我猜它是用来等待特定的时间,当时间刻度不同于1时。你可能正在做其他事情。这是我的测试代码。试试看。当您转到另一个选项卡并返回时,您将看到计时器正在计数。现在,将其替换为
WaitForSeconds
。当您转到另一个选项卡并返回时,它应该停止计数。我在mozilla firefox浏览器上测试了您的代码。结果是一样的。它要么减速,要么在几秒钟后完全停止。因为我等了10-20秒好几次,但只过了1-2秒。我找到了解决办法。你的代码完全正常。但问题是帧速率。每次更新都会刷新,所以在后台时会变慢。我设置Application.targetFrameRate=60;问题消失了。这很奇怪,因为我没必要这么做。也许有人弄乱了你的设置。很高兴你成功了