2017-04-26 117 views
1

我的代碼:調用()不會被調用

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); 
     } 
     Destroy(gameObject); 
    } 

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

任何人都能指出我爲什麼Invoke()不起作用?一旦滿足條件(EnemiesAlive <= 0),我想在改變場景之前增加2秒的延遲時間。輸出Debug.Log ("LEVEL WON!");,而Debug.Log ("Hello");不輸出。我知道我也可以使用StartCoroutine,但我想用Invoke()代替。

回答

1

那是因爲你正在調用Destroy(gameObject),如提到的m.rogalski,並且它沒有機會執行Invoke("ChangeScene",2f);

但是,我有一種感覺,您想立即銷燬該對象,而無需等待,因爲您希望該腳本中的內容(例如OnCollisionEnter2D)停止運行,但同時希望稍後加載場景。

如果是這種情況,那麼你必須把裝載功能連接到獨立遊戲物體一個單獨的腳本。當您致電Destroy(gameObject)時,該腳本不會破壞。

.Create一個新的遊戲物體被稱爲「SceneLdObj」

。將以下腳本附加到「SceneLdObj」遊戲對象。

public class SceneLoader : MonoBehaviour 
{ 
    int loadToScene = 1; 
    public void ChangeScene(int sceneLevel) 
    { 
     loadToScene = sceneLevel; 
     Invoke("loadScene", 2f); 
    } 

    private void loadScene() 
    { 
     SceneManager.LoadScene(loadToScene); 
    } 
} 

添加下面的腳本到腳本在你的問題:現在

SceneLoader sceneLoader; 

void Start() 
{ 
    sceneLoader = GameObject.Find("SceneLdObj").GetComponent<SceneLoader>(); 
} 

,你可以從你的模功能的負載功能,它仍將即使遊戲對象已經被銷燬工作。

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

    if (EnemiesAlive <= 0) 
    { 
     Debug.Log("LEVEL WON!"); 
     //Call that function from another script 
     sceneLoader.ChangeScene(1); 
    } 
    Destroy(gameObject); 
} 

編輯

這應該是你的新Enemy腳本:

public class Enemy : MonoBehaviour 
{ 
    public GameObject deathEffect; 
    public float health = 4f; 
    public static int EnemiesAlive = 0; 
    public int loadToScene; 
    SceneLoader sceneLoader; 

    void Start() 
    { 
     sceneLoader = GameObject.Find("SceneLdObj").GetComponent<SceneLoader>(); 
     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!"); 
      //Call that function from another script 
      sceneLoader.ChangeScene(1); 
     } 
     Destroy(gameObject); 
    } 

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

謝謝你正確預測我的意圖。我之前忘了提及。我已成功按照步驟操作,「添加下面的腳本...」,但我不確定如何將給定的代碼添加到我的代碼中。我試過並在SceneLoader上出現錯誤。我需要首先聲明SceneLoader嗎?我應該聲明哪種類型? – jer

+0

@jer將指令的最後部分直接修改到您的'Enemy'腳本中。只需複製一下。只要你創建了SceneLoader腳本並將其附加到名爲*「SceneLdObj」*的新GameObject中。這應該工作。 – Programmer

+0

我只是最近使用stackoverflow.com。我不知道我必須接受。對不起。感謝您的高舉。 :) – jer

2

問題是Invoke實際上被調用,但在被調用的方法執行之前,對象被銷燬。
爲了解決這個問題,移動Destroy(gameObject)ChangeScene方法:

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

    if (EnemiesAlive <= 0) 
    { 
     Debug.Log ("LEVEL WON!"); 
     Invoke("ChangeScene",2f); 
    } 
} 

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

也可以指定在此之後,對象將使用Destroy方法的重載被破壞的時間:Destroy(gameObject, 1.0f)(一秒後會破壞對象)。

+1

我想補充一個'其他{銷燬(本); ''以及。 – Draco18s