我的代码:
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没有被调用,并且场景立即改变而没有延迟。那是为什么?
“Debug.Log(”LEVEL WON!“);”是读,但“Debug.Log(”Coroutine启动?“);”没跑。
答案 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);
}