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 imamur · Sep 17, 2015 at 10:27 PM · coroutinecoroutinesstartcoroutinestopcoroutine

How to force Coroutine to finish

I want to force my coroutine to finish. This is code example. The log about Get out from Bus is never called, i think StopCoroutine didn't force to finish, but it removes the coroutine. What must I do to force the coroutine to finish?

 // Use this for initialization
 void Start () {
     StartCoroutine ("Walking");

     //Bus some how get accident
     Debug.Log ("Bus getting Accident");
     StopCoroutine ("UsingBus");
     Debug.Log ("Bus getting Accident Done");
 }

 public IEnumerator Walking(){
     yield return StartCoroutine ("UsingBus",5f);
     Debug.Log ("Get out from Bus");
 }

 public IEnumerator UsingBus(float s){
     Debug.Log ("Start Using Bus");
     yield return new WaitForSeconds (s);
 }
Comment
Add comment · Show 3
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 _Gkxd · Sep 18, 2015 at 05:24 AM 1
Share

What do you mean when you say "force your coroutine to finish?"

When you call StopCoroutine, you prevent the "UsingBus" coroutine from finishing, which means "Walking" won't finish either. If you comment out that line, then everything will print out after 5 seconds.

avatar image imamur _Gkxd · Sep 22, 2015 at 01:30 PM 0
Share

What I mean is I want that the Walking Coroutine will stop waiting Using Bus Couroutine to finish.

I'm sorry, my English is not good.

avatar image Pharan · Sep 18, 2015 at 05:34 AM 0
Share

StopCoroutine doesn't "finish" a coroutine. It's more like it "removes" it.

In any case, it seems like stopping a coroutine that another coroutine is dependent on causes it to not "yield return" so anything waiting for it won't hear back from it.

Is there a reason why you're structuring your code this way? Can't you do it another way with booleans or a state machine or something?

1 Reply

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by Jessespike · Sep 18, 2015 at 05:59 AM

Try something like this:

     bool accidentOccured = false;               // keeps track when accident has occured
 
     // Use this for initialization
     void Start()
     {
         StartCoroutine("Walking");
         //Bus some how get accident
         Debug.Log("Bus getting Accident");
         //StopCoroutine("UsingBus");
         accidentOccured = true;                 // accident occurs here
         Debug.Log("Bus getting Accident Done");
     }
     public IEnumerator Walking()
     {
         yield return StartCoroutine("UsingBus", 5f);
         Debug.Log("Get out from Bus");
     }
 
     public IEnumerator UsingBus(float s)
     {
         Debug.Log("Start Using Bus");
         //yield return new WaitForSeconds(s);
 
         float timePassed = 0f;
         while(timePassed < s)                   // ride the bus for the given time
         {
             Debug.Log("Riding bus");

             if (accidentOccured)                // break from coroutine when accident occures
             {
                 yield break;
             }

             yield return new WaitForEndOfFrame();
             timePassed += Time.deltaTime;
         }
     }
Comment
Add comment · Show 2 · 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 Bunny83 · Sep 18, 2015 at 10:05 AM 0
Share

Is there any good reason why you use WaitForEndOfFrame? It just creates unnecessary garbage, If you want a coroutine to loop each frame you should use

 yield return null;

Take a look at this question over here. "WaitForEndOfFrame" is only needed in some rare special cases.

avatar image Jessespike Bunny83 · Sep 18, 2015 at 03:54 PM 0
Share

I didn't know there was a difference. Thanks for the tip!

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

5 People are following this question.

avatar image avatar image avatar image avatar image avatar image

Related Questions

Can't Stop couroutines 1 Answer

Why doesnt my coroutine ever end? 2 Answers

Brain exploding ... Problem with an internal Coroutine manager 3 Answers

Is there any performance differences between Coroutine methods ? 3 Answers

Stop a coroutine on a single gameobject 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