Unity3d协程在while循环后停止

Unity3d coroutine stops after while-loop

我有一个单独的 LevelManager 正在加载一个关卡,等待来自新加载关卡的脚本将 GameObject 分配给 LevelManager,然后用它做一些事情。

我有以下代码:

// some GameObject calls the loadLevel coroutine
void somefunction(sceneToLoad){
    StartCoroutine(LevelManager.Instance.loadLevel (sceneToLoad));
}

// snippet of LevelManager.cs
public GameObject levelPrepper = null;
public IEnumerator loadLevel(string levelName){
    Application.LoadLevel (levelName);
    while (!levelPrepper)
        yield return null;
    yield return StartCoroutine (waitForLevelPrepper());
    print("yay");
    //do stuff
}

//snippet of the levelPrep.cs:
void Awake(){
    LevelManager.Instance.levelPrepper = gameobject;
}

问题是 "yay" 永远不会打印出来。

我看了一些资料,发现携带协程的GameObject被销毁时可能会发生这种情况。但是,LevelManager在这个过程中绝对不会被销毁,所以我很茫然。

问题是您不是在 LevelManager 上启动协程,而是在 "some gameObject" 上启动协程,这很可能会被销毁并且其协程将停止执行。

您可以通过将调用 StartCoroutine 移动到新方法中来解决此问题,如下所示:

void somefunction(sceneToLoad)
{
    LevelManager.Instance.LoadLevel(sceneToLoad));
}


public class LevelManager
{
    public void LoadLevel(string levelName)
    {
        StartCoroutine(LoadLevelCoroutine);
    }

    private GameObject levelPrepper = null;
    private IEnumerator LoadLevelCoroutine(string levelName){
        Application.LoadLevel (levelName);
        while (!levelPrepper)
            yield return null;
        yield return StartCoroutine (waitForLevelPrepper());
        print("yay");
        //do stuff
    }
}

或者直接调用LevelManager的StartCoroutine

void somefunction(sceneToLoad){
    LevelManager.Instance.StartCoroutine(LevelManager.Instance.loadLevel(sceneToLoad));
}