2017-04-26 108 views
0

我的代碼:StartCoroutine不會被調用

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 < = 0」已滿足,我想在改變場景之前添加延遲。我使用StartCoroutine,但出於某種原因,我不知道,StartCoroutine未被調用,場景立即發生變化。這是爲什麼?

enter image description here

「的debug.log(」 LEVEL贏了! 「);」被讀取,但「Debug.Log(」協程開始?「);」沒跑。

+0

你不應該在標題中加標籤。網站上的標籤系統足以顯示您正在使用的平臺 –

回答

2

在您致電SceneManager.LoadScene (loadToScene);之前,您並未等待delay()完成。當您致電SceneManager.LoadScene (loadToScene);時,會停止等待運行的所有協同程序,以便例程在兩秒鐘之前停止。

試着把日誌前WaitForSeconds和我認爲你會得到在場景更改之前的輸出。

如果你希望你的Die代碼等待你需要做模具也返回IEnumerable和產生的等待,然後調用DieStartCoroutine兩秒鐘。

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

感謝您的回覆。我可以使用其他方法而無需將die()方法更改爲IEnumerator?在更改場景之前,我嘗試使用Invoke(),但它也未被調用。在日誌和SceneManager之間放置Invoke()是否正確? – jer

0

使用協同作品,但我想嘗試invoke()。 我的代碼:

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!"); 
     Invoke("ChangeScene",2f);//can i invoke here? 
    } 
    Destroy(gameObject); 
} 

void ChangeScene() 
{ 
    Debug.Log ("Hello"); 
    loadToScene = 1; 
    SceneManager.LoadScene (loadToScene); 
} 
} 

我試過,但的invoke()不叫太和「的debug.log(」你好「)」不被輸出。

+0

只需刪除Destroy(gameObject);無論如何,如果您加載新場景,則不需要它。 – rs232