- Home /
Coroutine is being called but WaitForSeconds isn't working
I have an enemy Object that when HP drops to zero the death animation plays. I would like to wait for a few seconds before destroying the object so I've set up a Coroutine called Wait() which I call after starting the animation. The debug message in my coroutine does get displayed, but the enemy object is destroyed immediately. I'm not quite sure what I'm missing here. This is the enemy script: public class Enemy : MonoBehaviour { protected Animator m_Anim;
[System.Serializable]
public class EnemyStats
{
public int MaxHealth = 100;
public int Health = 100;
public int Strength = 1;
public int ExpToGive = 100;
}
public EnemyStats enemyStats = new EnemyStats();
// Start is called before the first frame update
void Start()
{
m_Anim = this.transform.Find("model").GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
}
public void DamageEnemy(int damage) {
enemyStats.Health -= damage;
Debug.Log("ENEMY DAMAGED! " + enemyStats.Health + this.name);
if (enemyStats.Health <= 0) {
m_Anim.Play("Die");
StartCoroutine("Wait");
GameMaster.KillEnemy(this);
GameMaster.AddExp(enemyStats.ExpToGive);
}
}
IEnumerator Wait()
{
Debug.Log("Coroutine started.");
yield return new WaitForSeconds(2);
}
}
Any advice would be much appreciated.
Answer by Xrsftw · Oct 26, 2019 at 09:40 PM
I am not quite sure of what your code does because of i Am not aware of what your GameMaster script does. But i ll assume that GameMaster.KillEneny destroys the enemy game object. You should use this line of code after your yield return in your coroutine.
Although you have to consider a better place to put your code that has to do with an animation. You should consider using animation events. Write a function (DestroyEnemy) that you want to call at the last frame of your death animation and set it in the animation window
Yeah i agree, he is not calling gameobject destroy function from the coroutine.
Answer by naviln · Oct 29, 2019 at 11:59 AM
The other answer has explained your issue - if you want something to happen after a delay, it needs to go inside the coroutine, after it has yielded for some duration. Just posting the code in case that helps:
public void DamageEnemy(int damage) {
enemyStats.Health -= damage;
Debug.Log("ENEMY DAMAGED! " + enemyStats.Health + this.name);
if (enemyStats.Health <= 0) {
m_Anim.Play("Die");
StartCoroutine("Wait");
}
}
IEnumerator Wait()
{
Debug.Log("Coroutine started.");
yield return new WaitForSeconds(2);
//kill the object after waiting 2 seconds
GameMaster.KillEnemy(this);
GameMaster.AddExp(enemyStats.ExpToGive);
}
Have a read of the manual here for more info: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html
Your answer
![](https://koobas.hobune.stream/wayback/20220612213936im_/https://answers.unity.com/themes/thub/images/avi.jpg)