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));
}
我有一个单独的 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));
}