Unity3d协程在while循环后停止

时间:2015-12-07 16:54:01

标签: c# unity3d while-loop singleton coroutine

我有一个单独的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绝对不会在此过程中被销毁,所以我不知所措。

1 个答案:

答案 0 :(得分:1)

问题是你没有在LevelManager上启动Coroutine,而是在“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));
}