- Home /
Respawn after delay
I'm writing a simple pong game, but have run into a roadblock. I have a ball that I would like to destroy itself and then respawn after a delay. My code is:
function OnCollisionEnter() {
Destroy(gameObject);
yield WaitForSeconds(2);
Instantiate(Ball, position, rotation);
}
It appears as though destroying the gameObject also destroys the coroutine that is waiting to re-instantiate the ball. Is there a way to do this? I could get the wall that destroyed the ball to do the respawning as a workaround, but I'm asking the broader question since I plan on teaching Unity to middle school students and need to be able to answer the question.
This is a duplicate of http://answers.unity3d.com/questions/378285/respawn-after-delay-1.html
Hello.
I am making a space invaders type game and was looking for a way to delay the respawn of the player. and this looks like it will do the trick.
Going to try it out when I get back home.
Thank you guys.
Answer by Vonni · Jan 10, 2013 at 11:13 PM
Hey there, got some solutions for ya
1. You could hide the objects mesh and collider before yield, then destroy it after yield and instantiate.
2. (Recommended) Have a master script, and then send a function call to that instead:
var mainScript : MainScript; // Link mainscript to this variable in inspector
function OnCollisionEnter() {
mainScript.DelayedRespawn();
Destroy(gameObject);
}
And then simply state your delay and instantiate in the main script with
function DelayedRespawn(){
yield WaitForSeconds(2);
Instantiate(Ball, position, rotation);
}
If I have a master script, where should I attach it? As I was looking for a workaround, I ran into an issue where I couldn't attach a gameobject in a scene on to a prefab variable in my asset list.
Answer by DMCH · Jan 10, 2013 at 11:19 PM
Hello jchuah,
One possible solution is to create a boolean inPlay, which is true when the ball is being bounced around, and false when the ball has been destroyed. Then, in the update function, check if the ball is in play, and if it isn't, instantiate it.
function OnCollisionEnter()
{
Destroy(gameObject);
yield WaitForSeconds(2);
inPlay = false;
}
function Update()
{
if(inPlay == false)
{
Instantiate(Ball, position, rotation);
inPlay = true;
}
}
Another uption would be not to actually destroy the ball, but allow the time to elapse, then move it to the starting position, and kick it off with Addforce, or whatever you are using.
Good luck with the class!