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