2017-08-30 169 views
0

我在Unity5製作了一款2D遊戲,其中玩家有一把槍,這是玩家的小孩,當玩家被擊中時,我該如何銷燬槍?目前我使用的代碼會破壞玩家而不是槍支。父母被銷燬時如何銷燬子對象?

public float health=500f; 
public GameObject gun; 

void OnTriggerEnter2D(Collider2D collider){ 
    BulletScript bullet = collider.gameObject.GetComponent<BulletScript>(); 

    if (bullet) { 
     health -= bullet.getdamage(); 
     bullet.hit(); 
     Handheld.Vibrate(); 

     if (health <= 0) { 
      GetComponent<Animator>().SetBool ("deadBool", true); 
      GetComponent<Animator>().SetTrigger ("deadTrigger"); 
      ExecuteAfterTime (1f); 
      Destroy (gun); 
     } 
    } 

} 
IEnumerator ExecuteAfterTime(float time){ 
    yield return new WaitForSeconds (time); 
    Destroy (gameObject); 
    GameObject child = gameObject.GetComponentInChildren<> (gameObject); 
} 

注:槍是應用腳本的玩家的孩子。

+0

我認爲這個槍是自動垃圾收集的,當沒有更多的引用存在。所以當你的播放器死亡時,參考計數器減1。如果你沒有任何進一步的參考資料,它很快就會被扔掉。無論如何:爲什麼不叫'摧毀(孩子)'? – HimBromBeere

+1

子對象*應該*在父對象被銷燬時自動銷燬。請用GameObject和孩子做一個簡單的測試,然後摧毀父母。孩子也應該走了。 – Programmer

+0

該槍必須是層次視圖上的玩家的子女才能銷燬。 –

回答

0

假設你想毀了每一個孩子可以先全部取回所有的孩子:

allChildren = gameObject.getComponentsInChildren() 

這將導致一個數組,這樣以後就可以通過他們就像一個循環簡單地重複:

for (int a = 0; a < allChildren.length; aa ++) 
{ 
    Destroy(allChildren[a].gameObject); 
} 

噴槍是否要銷燬該循環您可以查詢有關對象的詳細信息,並調用破壞內部的,當你發現槍,喜歡的事,唯一的孩子:

if(allChildren[a].name == "gun") 
{ 
    Destroy(allChildren[a].gameObject) 
} 
0

如果你想消滅只槍,那麼我會說保持這樣的腳本你的槍的參考:

public GameObject gun; 

從督察分配槍。然後只要像這樣擊毀它:

Destroy(gun); 

如果你有多個孩子在玩家下。然後,你可以創建一個這樣的數組:

public GameObject[] destroyables; 

從督察分配並保存的預製。然後使用一個循環來擊毀。

for(int i=0;i<destroyables.Length;i++) Destroy(destroyables[i]); 
+0

我按照你所說的做了改變,而且我的槍也被摧毀,但唯一的問題是在玩家被摧毀之前有一個尷尬的延遲被毀壞(我已經更新了代碼) –

+0

你想什麼時候銷燬槍?玩家被毀壞後或與玩家? – ZayedUpal

+0

與玩家 –

0

當你摧毀父遊戲物體,所有的孩子將自動銷燬。但是你試圖手動銷燬它們。 由於您在協程中調用了Destory(gameObject),因此您有延遲。嘗試將Destroy(gun)移動到協程。

public float health=500f; 
public GameObject gun; 

void OnTriggerEnter2D(Collider2D collider){ 
BulletScript bullet = collider.gameObject.GetComponent<BulletScript>(); 

    if (bullet) { 
     health -= bullet.getdamage(); 
     bullet.hit(); 
     Handheld.Vibrate(); 

     if (health <= 0) { 
      GetComponent<Animator>().SetBool ("deadBool", true); 
      GetComponent<Animator>().SetTrigger ("deadTrigger"); 
      StartCoroutine(ExecuteAfterTime (1f));    
     } 
    } 

} 
IEnumerator ExecuteAfterTime(float time){ 
    yield return new WaitForSeconds (time); 

    //destroying gun only 
    Destroy (gun); 

    //manually destroying all of childre 
    GameObject child = gameObject.GetComponentInChildren<> (gameObject); 
    foreach(var entry in child) 
    { 
     Destroy(entry); 
    } 

    Destroy (gameObject); 

} 
+0

使用毀滅(槍);在ExecuteAfterTime()方法不起作用。它沒有破壞槍支。 –

+0

您可以在StartCoroutine()中使用ExecuteAfterTime()。 我正在編輯編輯的答案。 –