我有一个加载关卡的单例 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 上启动协程,而是在“某个游戏对象”上启动协程,该对象很可能会被销毁,并且其协程将停止执行。
您可以通过将 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));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)