2017-08-30 129 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()。 我正在编辑编辑的答案。 –