【问题标题】:StartCoroutine does not get calledStartCoroutine 没有被调用
【发布时间】:2017-04-26 11:52:11
【问题描述】:

我的代码:

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

"Debug.Log ("LEVEL WON!");"已读取但“Debug.Log ("Coroutine started?");"没有运行。

【问题讨论】:

  • 您不应该在标题中放置标签。网站上的标签系统足以显示您正在使用的平台

标签: c# unity3d unity5


【解决方案1】:

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

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

如果您希望您的 Die 代码等待两秒钟,您需要让 Die 也返回一个 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);
 }

【讨论】:

  • 感谢您的回复。我可以在不将 die() 方法更改为 IEnumerator 的情况下使用其他方法吗?我在更改场景之前尝试使用 Invoke() 但它也没有被调用。将 Invoke() 放在 log 和 SceneManager 之间是否正确?
猜你喜欢
  • 2018-06-20
  • 2017-12-29
  • 1970-01-01
  • 2011-11-15
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
相关资源
最近更新 更多