StartCoroutine 没有被调用

StartCoroutine does not get called

我的代码:

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?");
     }
}

代码是当敌人的数量小于等于0时切换场景。鉴于条件 "EnemiesAlive <= 0" 已满足,我想在更改场景之前添加延迟。我用的是StartCoroutine,不知道什么原因,StartCoroutine没有被调用,场景马上就变了,没有延迟。这是为什么?

"Debug.Log ("级别获胜!");"已读取但 "Debug.Log ("协程已启动?");"没有 运行.

您没有在等待 delay() 完成后才调用 SceneManager.LoadScene (loadToScene);。当您调用 SceneManager.LoadScene (loadToScene); 时,会停止所有等待 运行 的协程,因此例程会在两秒结束之前停止。

尝试将日志放在 WaitForSeconds 之前,我 认为 你会在场景改变之前得到输出。

如果你想让你的 Die 代码等待两秒钟,你需要让 Die 也 return 一个 IEnumerable 并让出等待,然后用 StartCoroutine 调用 Die .

 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);
 }