rap-2-h
rap-2-h

Reputation: 31978

Disable GameObject but continue to run Coroutine

I have a BonusController script as a component of a Bonus gameObject. This Bonus must be destroyed on collision but has to "act" for a few seconds. I have started a coroutine for this, but the script stops its execution (I think it's because I set the gameObject inactive). Here is the code of BonusController:

void OnTriggerEnter2D(Collider2D col)
{
    StartCoroutine(speedUp(1));
    gameObject.SetActive(false);
}

IEnumerator speedUp(float seconds)
{
    Debug.Log("before");
    yield return new WaitForSeconds(seconds);
    Debug.Log("after"); // <--- This is never called
}

How can I remove the object and don't stop the coroutine script execution?

Upvotes: 0

Views: 7056

Answers (3)

Al Baker
Al Baker

Reputation: 133

In order to destroy the object after some time, call destroy inside the coroutine after the yield.

yield return WaitForSeconds(second);
Destroy(this);

Now it is properly destroyed and will free up memory opposed to still being there, invisible, but taking up resources.

Upvotes: 0

Hamza Hasan
Hamza Hasan

Reputation: 1398

You cannot pull the ground on which you are standing. :)

Just disable the SpriteRenderer as you are using 2D methods. And keep the object alive and enable.

{
    StartCoroutine(speedUp(1));
    //gameObject.SetActive (false);
    GetComponent<SpriteRenderer> ().enabled = false;
    GetComponent<Collider2D> ().enabled = false;
    // Above line will deactivate the first collider it will find.
}

IEnumerator speedUp(float seconds)
{
    Debug.Log("before");
    yield return new WaitForSeconds(seconds);
    Debug.Log("after"); // <--- This is never called
}

Upvotes: 1

HoloLady
HoloLady

Reputation: 1043

Can't you just disable the mesh renderer and collider? This way the gameobject will still exists, but the user won't be able to see it.

Upvotes: 6

Related Questions