Instantiate an object as soon as another object is destroyed

So I want the NewShield() method to be called right after the LargeShieldClone object is destroyed.

What usually ends up happening is that NewShield() is called at the same time as WaitAndDestroy().

I’ve tried everything I can think of. Any ideas? Thanks.

using UnityEngine;

using System.Collections;

public class LargeShieldInstantiate : MonoBehaviour {

public GameObject Shield;
GameObject ShieldClone;
public GameObject LargeShield;
GameObject LargeShieldClone;
int secondsBeforeDestruction = 10;

void OnCollisionEnter2D(Collision2D collider){
	if(collider.gameObject.tag == "LSPowerup"){
		Destroy (this.gameObject);
		LargeShieldClone = Instantiate (LargeShield) as GameObject;
		LargeShieldClone.transform.parent = GameObject.Find ("ShieldRotator").transform;
		WaitAndDestroy ();
	}
}

IEnumerator WaitAndDestroy(){
	Destroy (LargeShieldClone, secondsBeforeDestruction);
	yield return new WaitForSeconds (10);
	NewShield ();
}

void NewShield(){
	ShieldClone = Instantiate (Shield) as GameObject;
	ShieldClone.transform.parent = GameObject.Find ("ShieldRotator").transform;
}

}

swap round these two lines -

Destroy (LargeShieldClone, secondsBeforeDestruction);
     yield return new WaitForSeconds (10);

because the way you have it now you are waiting 10 seconds after its destroyed before calling NewShield()

edit -
Also you could even lose the NewShield() and put the commands inside it directly after the lines that destroys your object.

:wink:

Use OnDestroy on the destroyed object:

public class MyObject:MonoBehaviour{
    public static event Action OnObjectDestroy = ()=>{};
    void OnDestroy(){
       OnObjectDestroy();
    }
}

This goes on a script that you attached to your object.

And then:

public class LargeShieldInstantiate : MonoBehaviour {

    void Awake(){
        MyObject.OnObjectDestroy += NewShield;
    }
    void OnDestroy(){
        MyObject.OnObjectDestroy -= NewShield;
    }
}