父母被摧毁时如何销毁子对象?

时间:2017-08-30 09:40:24

标签: c# unity3d unity5

我正在Unity 5制作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);
}

注意:枪是应用脚本的玩家的孩子。

3 个答案:

答案 0 :(得分:0)

假设你想要摧毁每个孩子,你首先可以通过以下方式检索所有孩子:

allChildren  = gameObject.getComponentsInChildren()

这会产生一个数组,所以在你可以简单地用一个循环遍历它们之后:

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

如果枪是你想要在该循环内销毁的唯一孩子,你可以查询有关该物体的细节,并在找到枪时调用Destroy,如:

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

答案 1 :(得分:0)

如果你想只销毁枪支,那么我会说在你的剧本中保留你的枪的参考:

public GameObject gun;

从检查员处分配枪支。然后在这样击中时摧毁它:

Destroy(gun);

如果玩家有多个孩子。然后你可以创建一个这样的数组:

public GameObject[] destroyables;

从检查员分配并保存预制件。然后在击中时使用循环来销毁。

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

答案 2 :(得分:0)

当你破坏父游戏对象时,所有的孩子都会自动销毁。但是你试图手动销毁它们。 你有延迟,因为你在协程中调用Destory(gameObject)。尝试将Destroy(枪)移动到协程。

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);

}