StartCoroutine不会被调用

时间:2017-04-26 01:03:00

标签: c# unity3d unity5

我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Enemy : MonoBehaviour {

     public GameObject deathEffect;
     public float health = 4f;
     public static int EnemiesAlive = 0;
     public int loadToScene;

     void Start ()
     {
         EnemiesAlive++;
     }

     void OnCollisionEnter2D (Collision2D colInfo)
     {
         if (colInfo.relativeVelocity.magnitude > health)
         {
             Die();
         }
     }

     void Die ()
     {
         Instantiate(deathEffect, transform.position, Quaternion.identity);

         EnemiesAlive--;

         if (EnemiesAlive <= 0)
         {
             Debug.Log ("LEVEL WON!");
             StartCoroutine (delay()); //delay here

             loadToScene = 1;
             SceneManager.LoadScene (loadToScene);
         }
         Destroy(gameObject);
     }

     IEnumerator delay ()
     {
         yield return new WaitForSeconds(2f);
         Debug.Log ("Coroutine started?");
     }
}

代码是关于当敌人数量小于或等于零时改变场景。我想在更改场景之前添加延迟,因为条件“EnemiesAlive&lt; = 0”已满足。我使用StartCoroutine,但由于某些原因我不知道,StartCoroutine没有被调用,并且场景立即改变而没有延迟。那是为什么?

enter image description here

“Debug.Log(”LEVEL WON!“);”是读,但“Debug.Log(”Coroutine启动?“);”没跑。

1 个答案:

答案 0 :(得分:2)

在致电delay()之前,您没有等待SceneManager.LoadScene (loadToScene);完成。当你调用SceneManager.LoadScene (loadToScene);来停止所有等待运行的协同程序时,例程会在两秒钟之前停止。

尝试将日志放在WaitForSeconds之前,我,您将在场景发生变化之前获得输出。

如果您希望Die代码等待两秒钟,您需要让Die也返回IEnumerable并等待等待,然后使用Die调用StartCoroutine

 void OnCollisionEnter2D (Collision2D colInfo)
 {
     if (colInfo.relativeVelocity.magnitude > health)
     {
         StartCoroutine(Die());
     }
 }

 IEnumerator Die ()
 {
     Instantiate(deathEffect, transform.position, Quaternion.identity);

     EnemiesAlive--;

     if (EnemiesAlive <= 0)
     {
         Debug.Log ("LEVEL WON!");
         yield return StartCoroutine (delay()); //delay here

         loadToScene = 1;
         SceneManager.LoadScene (loadToScene);
     }
     Destroy(gameObject);
 }