Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by bsimms2086 · Oct 26, 2019 at 06:21 PM · animatorwaitforsecondscall

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.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
1

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

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Kristifor_p · Oct 26, 2019 at 09:50 PM 0
Share

Yeah i agree, he is not calling gameobject destroy function from the coroutine.

avatar image
0

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

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

144 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Yield waitforseconds not consistent for animation-unity2D 0 Answers

Animator - Wait until animation finishes 3 Answers

SetTrigger animation won't wait for correct time before continuing code 1 Answer

2D Animation does not start 1 Answer

Create animation from script 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges