我正在开发一些飞行模拟器程序。现在,我正在尝试让该级别在延迟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");

}


如果有人可以在代码中找到问题,那将是一个很大的帮助,因为我已经整天都在努力,而且无法修复它。

谢谢!

最佳答案

通常,当WaitForSeconds无法正常工作时,它是以下两种情况之一:


Time.timeScale设置为0。
在时间到之前,该对象已被破坏或变为非活动状态。


在您的情况下,您要在调用yield WaitForSeconds之前销毁运行协程的游戏对象。销毁被推迟到帧的末尾,这样代码才能执行直到成品率,但是随后GameObject&MonoBehaviour将被销毁,协程也随之销毁。

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

关于c# - Unity-WaitForSeconds()不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29552235/

10-10 08:09