• 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
Question by Rolfrider · Oct 07, 2017 at 08:28 AM · c#coroutineyieldwaitforseconds

What is wrong with this use of WaitForSeconds?

Hello everyone! I try to use WaitForSeconds method, but it dosent work at all and I dont know whats wrong. Now it just freeze the unity editor. My goal is to play animation before destroying and moving other objects.

  public void DeleteColumnsRight()
     {
         for (int x = gridWidth/2; x < gridWidth ; x++)
         {
             if (IsColumnFull(x))
             {
                 StartCoroutine(PlayCrushAnimation(x));
                 //DeleteMinoInColumn(x);
                 //MoveAllToRight(x - 1);
                 x--;
 
 
 
             }
         }
         
     }
  IEnumerator PlayCrushAnimation(int x)
     {
         for (int y = 0; y < gridHeight; y++)
         {
             animator = grid[x, y].gameObject.GetComponent<Animator>();
             animator.SetTrigger("Crush");
         }
         
         yield return new WaitForSeconds(3);
 
         DeleteMinoInColumn(x);
         MoveAllToRight(x - 1);
     }
Comment

People who like this

0 Show 1
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 Hellium · Oct 07, 2017 at 09:30 AM 0
Share

Have you tried to use the step by step debugger of your IDE? Example for Visual Studio

1 Reply

· Add your reply
  • Sort: 
avatar image
Best Answer

Answer by Bunny83 · Oct 07, 2017 at 09:42 AM

There are several things that could give you problems / not what you want. First of all the for loop inside DeleteColumnsRight runs and completes in one frame as it is not a coroutine. Only a coroutine can wait for something. That means you start "gridWidth/2" coroutines all at the same time. Each will yield in the same frame and therefore all coroutines will continue all at the same time, after 3 sec. I guess that's not what you had in mind.

Next problem is, which is causing your crash is your for loop in your DeleteColumnsRight method. That for loop is equivalent to this loop:

 {
     int x = gridWidth/2
     while (x < gridWidth)
     {
         if (IsColumnFull(x))
         {
             StartCoroutine(PlayCrushAnimation(x));
             x--;
         }
         x++
     }
 }

As you can see if the column "x" is full you start a coroutine and decrement "x" and immediately increment x again. So the next iteration will use the same x again. Since your coroutine does not change the state of your column x before the yield it is still full. So you have an infinite loop here as x will be stuck by the first column that is full.

Finally keep in mind that when you want any kind of animation the game will continue to run during that time. You can't trap the code in an infinite loop as nothing will be shown during that time. All your code need to complete so the current frame can finish and actually update the screen. That means while your animation runs you usually want to block any user input and maybe ans automatic mechanism which runs in parallel.

So you should do two things:

  • first move all your code you've posted here into your coroutine. That way you can actually wait between two columns.

  • Maybe use a boolean value which you set to true at the start of your coroutine and back to false when your done. This can be used to prevent unwanted actions by other scripts.

So it might look something like this:

 public IEnumerator DeleteColumnsRight()
 {
     deleteAnimationStarted = true;
     int x = gridWidth/2;
     while(x < gridWidth)
     {
         if (IsColumnFull(x))
         {
             for (int y = 0; y < gridHeight; y++)
             {
                 animator = grid[x, y].gameObject.GetComponent<Animator>();
                 animator.SetTrigger("Crush");
             }
             yield return new WaitForSeconds(3);
             DeleteMinoInColumn(x);
             MoveAllToRight(x - 1);
         }
         else
             x++;
     }
     deleteAnimationStarted = false;
 }

ps: it's in general bad practise to modify a for loop variable manually outside the for loop header. If you needs such functionality it's better to use a while loop where the increment is seperated. This makes it easier to spot such problems. If a programmer sees a for loop he assumes everything in the for loop header is responsible for how often the loop runs.

Comment
Rolfrider

People who like this

1 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 Rolfrider · Oct 07, 2017 at 09:58 AM 0
Share

Thanks a lot, i fixed it using your advices :) .

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.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

406 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 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 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

Playing footsteps with interval 1 Answer

Waypoint / Yield help 1 Answer

Trouble Resuming after Yielding while Inside Coroutine 1 Answer

Script gets stuck on WaitForSeconds() 1 Answer

my script is broken again(enemy refuses to stop seeing me) 1 Answer


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