- Home /
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;
}
}
Are you sure NewShield() is called at the same time as WaitAndDestroy()? Or is NewShield() called at the same time with Destroy (LargeShieldClone)?
Perhaps StartCoroutine ins$$anonymous$$d of simply calling the function.
Answer by Digital-Phantom · Apr 11, 2015 at 09:43 AM
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.
;)
Thanks, Phantom.
I seem to also have an issue with calling the WaitAndDestroy() method. I think c# needs it to be a void ins$$anonymous$$d of an IEnumerator. However I can't use WaitForSeconds() in a void. Do you know any way around this?
Answer by fafase · Apr 11, 2015 at 05:44 PM
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;
}
}
Your answer
Follow this Question
Related Questions
Yeild and WaitForSeconds and Instantiate 1 Answer
Destroy then Clone Help please? 2 Answers
Only the first half of my coroutine works 1 Answer
How can I instantiate and move objects smoothly? 1 Answer
Respawn after delay 3 Answers