【问题标题】:Unity3d coroutine stops after while-loopUnity3d协程在while循环后停止
【发布时间】:2016-03-12 08:56:57
【问题描述】:

我有一个单例 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;
}

问题是“耶”永远不会被打印出来。

我做了一些阅读,发现当承载协程的游戏对象被销毁时,可能会发生这种情况。但是,LevelManager在这个过程中绝对不会被破坏,所以我很茫然。

【问题讨论】:

    标签: c# unity3d while-loop singleton coroutine


    【解决方案1】:

    问题是您不是在 LevelManager 上启动协程,而是在“某个游戏对象”上启动协程,这很可能会被销毁并且其协程将停止执行。

    您可以通过将调用 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));
    }
    

    【讨论】:

    • 非常感谢您的及时答复!这解决了问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多