Unity: 在加载新场景时,正在运行的协程会被销毁吗?

7

如果您在场景中连接了一个脚本并运行了协程,当场景结束时,该协程会被终止/销毁吗?即使该协程包含一个无限循环(如While loop)也是如此?


例如,如果我在场景中连接了以下协程:

IEnumerator SampleCoroutine()
{
    while (true) {
        yield return new WaitForSeconds(1.0f);
    }
    yield return null;
}

当一个新场景被加载时,假设对象上没有附加任何"DontDestroyOnLoad(...)"的脚本,协程是否仍会在新加载的场景中执行?
提问原因:我需要知道是否需要保留所有活动协程的列表,以便在每次场景更改后结束它们。我不希望随着使用更多场景而导致性能下降。
1个回答

8

简短回答:

是的,它们将被终止,因为Coroutine会根据其所在的MonoBehaviour运行。没有MonoBehaviour就没有Coroutine


1
所以,只是为了澄清一下,当调用它们的对象被销毁时,它们将被终止? - Ben Hayward
3
是调用 StartCoroutine 的 MonoBehaviour 决定何时停止它。例如,如果 MonoBehaviour A 使用 MonoBehaviour BIEnumerator 方法调用 StartCoroutine,则协同程序将只在 MonoBehaviour A 被销毁时停止调用。 - Danny Herbert
1
@BenHayward 就像 gjttt1 所说的那样。我编辑了答案,因为我的回答以“不”开头,但应该是“是”。 - Jerry Switalski
我会补充一个重要的细节:虽然协程可能在场景加载时停止,但最好在更改场景之前表达协程停止(特别是大型复杂协程),以便垃圾收集器(GC)可以正确地销毁协程的内存。否则,块将全部一次性被分块在GC中(如果重量很重,则使负载更加不稳定),或者有可能块会悬挂在空中(未使用,但不完全销毁)一段时间。 - user3345048
垃圾回收器只会销毁被正确标记为要销毁的内存块。(例如,“DontDestroyOnLoad”明确告诉它不要销毁相关块,即使它们未使用。)当您关闭场景并且协程仍处于活动状态时,有时需要一段时间才能将其相关内存块标记为要销毁,从而使任务挂起到下一个场景(这可能会降低性能)。 - user3345048

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接