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.

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

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!

Thanks for the responses, everyone!