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