父母被销毁时如何销毁子对象?
我在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);
}
注:枪是应用脚本的玩家的孩子。
假设你想毁了每一个孩子可以先全部取回所有的孩子:
allChildren = gameObject.getComponentsInChildren()
这将导致一个数组,这样以后就可以通过他们就像一个循环简单地重复:
for (int a = 0; a < allChildren.length; aa ++)
{
Destroy(allChildren[a].gameObject);
}
喷枪是否要销毁该循环您可以查询有关对象的详细信息,并调用破坏内部的,当你发现枪,喜欢的事,唯一的孩子:
if(allChildren[a].name == "gun")
{
Destroy(allChildren[a].gameObject)
}
如果你想消灭只枪,那么我会说保持这样的脚本你的枪的参考:
public GameObject gun;
从督察分配枪。然后只要像这样击毁它:
Destroy(gun);
如果你有多个孩子在玩家下。然后,你可以创建一个这样的数组:
public GameObject[] destroyables;
从督察分配并保存的预制。然后使用一个循环来击毁。
for(int i=0;i<destroyables.Length;i++) Destroy(destroyables[i]);
我按照你所说的做了改变,而且我的枪也被摧毁,但唯一的问题是在玩家被摧毁之前有一个尴尬的延迟被毁坏(我已经更新了代码) –
你想什么时候销毁枪?玩家被毁坏后或与玩家? – ZayedUpal
与玩家 –
当你摧毁父游戏物体,所有的孩子将自动销毁。但是你试图手动销毁它们。 由于您在协程中调用了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);
}
使用毁灭(枪);在ExecuteAfterTime()方法不起作用。它没有破坏枪支。 –
您可以在StartCoroutine()中使用ExecuteAfterTime()。 我正在编辑编辑的答案。 –
我认为这个枪是自动垃圾收集的,当没有更多的引用存在。所以当你的播放器死亡时,参考计数器减1。如果你没有任何进一步的参考资料,它很快就会被扔掉。无论如何:为什么不叫'摧毁(孩子)'? – HimBromBeere
子对象*应该*在父对象被销毁时自动销毁。请用GameObject和孩子做一个简单的测试,然后摧毁父母。孩子也应该走了。 – Programmer
该枪必须是层次视图上的玩家的子女才能销毁。 –