Unity - WaitForSeconds() 不起作用

use*_*282 1 c# unity-game-engine

我正在开发一些飞行模拟器程序。现在我试图让关卡在 4 秒的延迟后重新启动,但它一直在等待并且没有响应。这是我现在的代码(在 C# 中):

void Update () {

    //other irrelevant code in front

    float TerrainHeightLocation = Terrain.activeTerrain.SampleHeight (transform.position);

    if (TerrainHeightLocation > transform.position.y) { //the plane crashed

        StartCoroutine(Wait(TerrainHeightLocation));


    }
}

IEnumerator Wait( float TerrainHeightLocation) {
    transform.position = new Vector3 (transform.position.x,
                                      TerrainHeightLocation,
                                      transform.position.z);
    Instantiate(explosion, transform.position, transform.rotation);
    Destroy(gameObject);

    Debug.Log ("Waiting");
    yield return new WaitForSeconds(4.0f); // waits x seconds

    Debug.Log ("Waited for x seconds");

    Application.LoadLevel(Application.loadedLevel);
    Debug.Log ("Reloaded level");

}
Run Code Online (Sandbox Code Playgroud)

如果有人能在代码中找到问题,那将是一个很大的帮助,因为我已经尝试了一整天,但无法修复它。

谢谢!

Hua*_*cha 6

通常,当 WaitForSeconds 不起作用时,它是以下两种情况之一:

  1. Time.timeScale 设置为 0。
  2. 对象在时间到之前被销毁或变为非活动状态。

在您的情况下,您在调用 yield WaitForSeconds 之前正在销毁运行协程的游戏对象。Destroy 被推迟到帧结束,所以直到 yield 的代码才会执行​​,但之后 GameObject 和 MonoBehaviour 将被销毁,协程也随之被销毁。

解决方案:在关卡结束和重新启动之间持续存在的对象上使用协程。为了使对象在加载关卡时仍然存在(正如您在代码中所做的那样),您需要调用DontDestroyOnLoad