【问题标题】:Unity coroutines stop while in backgroundUnity 协程在后台停止
【发布时间】:2014-02-12 18:04:57
【问题描述】:

我的问题如下:目前我的游戏中运行了几个适用于 android/iOS 的协程,但是当我将游戏发送到后台以便用手机尝试其他事情时,这些协程停止并且只有在我返回后才会恢复游戏;有什么办法可以让协程在游戏处于后台时继续运行?

【问题讨论】:

  • 这是 android 和 IOS 的问题还是只是 android 的问题?
  • 两个平台都有问题

标签: c# android ios unity3d coroutine


【解决方案1】:

Android will suspend your application by designCo-routines run in the same thread as your Updates 因此,不太可能在前台运行方面区分两者。话虽如此,有办法解决这个问题。您可以构建一个与 android 平台对话的 plugin 或使用 OnApplicationPause 并计算在应用程序中传递的时间,并在两者之间的时间范围内执行您想做的任何事情。第一个要求你按照building a plugin 做一些事情 第二个使用以下

public void OnApplicationPause(bool paused) {
    if(paused) {
       // Game is paused, remember the time
    } else {
       // Game is unpaused, calculate the time passed since the game was paused and use this time to calculate build times of your buildings or how much money the player has gained in the meantime. 
    }
}

更多信息见 thisthis

还要注意building a plugin requires a Pro Licence

其他协同例程资源

【讨论】:

  • 感谢您的回答!一个快速跟进的问题,有没有办法知道当前在游戏中运行的所有协程,即使它们在不同的脚本中?可能不是,但值得一问
  • 没有太多内置的协程管理。有一些第三方库可以提供帮助。
  • @user3224109 我有一个愚蠢的小技巧,我从未完成过,但这可能会让你在协程跟踪方面有所作为。我已经在Github fwiw 上抛出了我所拥有的。
  • 我还要看看我添加到附加资源中的 Co-Routine Scheduler
【解决方案2】:

您不能让某些东西在后台永久运行。操作系统最终会暂停它。仅允许使用 VOIP、媒体播放器或 GPS。其他所有内容都只会在暂停之前获得延长的时间范围。

对于 iOS,您可以在 info.plist 中更改“应用程序不在后台运行”

【讨论】:

  • 但是游戏在后台运行,只是协程停止了,所以没有办法让协程在后台继续运行??
  • 按照设计,没有办法这样做。正如@Terrance 发布的那样,您可以使用 OnApplicationPause 作为存储状态并在恢复时进行计算的技巧。
【解决方案3】:

使用 Application.runInBackground = true;

查看 Unity 文档Application.runInBackground

【讨论】:

  • @Naeim 它在文档中说,但这仍然很有用,因为人们可能希望在编辑器中使用它。 Unity 文档是这样说的:注意:此属性在 Android 和 iOS 上被忽略。
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 2016-06-15
  • 1970-01-01
  • 2021-11-15
  • 2016-03-12
  • 1970-01-01
相关资源
最近更新 更多