[SOLVED] I cannot get WaitForSeconds to work
DESIRED RESULT: Player takes fatal blow, Die() method is called, explosion sound plays, player object is destroyed, and LevelManager takes us to the next scene. A delay is included to allow sound effects to finish playing before scene end.
ACTUAL RESULT: Die() Method called, explosion sound plays, player is destroyed, and that's it.
public void Die()
{
Debug.Log("Here 1");
StartCoroutine(WaitAndEnd(10f));
Debug.Log("Here 2");
AudioSource.PlayClipAtPoint(playerDeath, transform.position);
Debug.Log("Here 3");
Instantiate(playerExplosion, gameObject.transform.position, Quaternion.identity);
Debug.Log("Here 4");
Destroy(gameObject);
EnemySpawner.wave = 1;
Debug.Log("Here 5");
}
IEnumerator WaitAndEnd(float wait)
{
Debug.Log("Here 6");
yield return new WaitForSeconds(wait);
Debug.Log("Here 7");
LevelManager levelManager = GameObject.Find("LevelManager").GetComponent<LevelManager>();
Debug.Log("Here 8");
levelManager.LoadLevel("End");
Debug.Log("Here 9");
}
When run, the Debug.Log shows it hits these points: 1, 6, 2, 3, 4, 5
PROBLEM: The yield statement isn't producing a delay in the WaitAndEnd method. Yield gets hit once and then control returns to Die() instead of passing through the rest of the method.
Why? Why no delay? I've been working on this for a couple hours and I've tried all kinds of things now, but I'm tapped out and need help. What am I doing wrong? Why isn't WaitForSeconds producing the delay I want? Thanks in advance.
Answer by LazyElephant · Jan 03, 2016 at 08:48 AM
yield return new WaitForSeconds(time)
is doing what it's supposed to. It yields control to the rest of your code until the wait time is over. This means that it returns immediately to your die() function to allow it to continue running.
The reason you aren't seeing the rest of the code run, is because you're destroying the game object in your die function. This causes the object to be destroyed later in the frame. Since the object is destroyed, the WaitAndEnd function is gone and can't keep running, so you'll never see it run to the end. You'll have to wait to destroy the player object until your wait time is over by adding Destroy(gameObject)
to WaitAndEnd after the yield, or you'll have to put the WaitAndEnd coroutine on a different object, one that isn't being destroyed.
Your answer
Follow this Question
Related Questions
Raycast on Graphic with Custom Mesh, 1 Answer
Dynamic casting? 1 Answer
[SOLVED]My UI text don't update from script 3 Answers
UNet NetworkMessages example? 1 Answer
Double Jump Unity 1 Answer