Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 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 /
  • Help Room /
avatar image
0
Question by UPMGabo · Apr 26, 2021 at 08:55 PM · triggersenum

Why are the CoRoutines not stopping?

Basically I have a 2D game that is like the old Zeldas: two connected rooms with a controllable player.

I have defined two Collision2D triggers between the two rooms in order to load the things I need:

  1. One, executed ONCE on entering room B from room A, to execute the routines for spawning enemies and start a timer.

  2. And another one, executed ONCE on exiting room B to room A, that actually stops the routines previously created.


This is the script that both Collision2D objects inherit, including the routines:

 public class RoomTransferController : MonoBehaviour
 {
     ...
     private IEnumerator spawn;
     private IEnumerator timer;
     
     void Start()
     {
         spawn = AddEnemy();
         timer = CreateTimer();
         ...
     }
 
     private void OnTriggerEnter2D(Collider2D other) {
         if (other.gameObject.CompareTag("Player") && this.gameObject.CompareTag("TrialEnter") && other.isTrigger) 
         {
             StartCoroutine(spawn);
             StartCoroutine(timer);
         }
         if (other.gameObject.CompareTag("Player") && this.gameObject.CompareTag("TrialExit") && other.isTrigger) 
         {
             StopCoroutine(spawn);
             StopCoroutine(timer);
         }
     }
 
     private IEnumerator AddEnemy() 
     {
         while (true) 
         {
             int rnd = UnityEngine.Random.Range(0, 5);
             // spawnPoints is just a Vector2[]
             Instantiate(prefabEnemy, spawnPoints[rnd], Quaternion.identity);
             yield return new WaitForSeconds(5f);
         }
     }
 
     private IEnumerator CreateTimer() 
     {
         int currentTime = 0;
         while(true)
         {
             currentTime += 1;
             // elapsedTime is a Text object
             elapsedTime.text = currentTime.ToString();
             yield return new WaitForSeconds(1f);
         }
     }
 }

The script looks perfectly fine but when executing the game, the routines do not stop when exiting room B. It actually enters in the condition from OnTriggerEnter2D, but it seems to ignore the StopCoroutine method.


I tried to set spawn and timer variables every time StartCoroutine is called in order to not be null when calling StopCoroutine, but it does not solve it.


I also tried to make a State Machine, that when entering or exiting room B, it will update isPlayerInTrial and depending on its value, it will stop the routines in Update:


 public enum TrialState {
     wait,
     enter,
     exit
 }
 
 public class RoomTransferController : MonoBehaviour
 {
     private TrialState isPlayerInTrial;
     ...
 
     void Start()
     {
         isPlayerInTrial = TrialState.wait;
         spawn = AddEnemy();
         timer = CreateTimer();
         ...
     }
 
     void Update()
     {
         if (isPlayerInTrial == TrialState.exit)
         {
             StopCoroutine(spawn);
             StopCoroutine(timer);
             isPlayerInTrial = TrialState.wait;
         }
     }
 
     private void OnTriggerEnter2D(Collider2D other) {
         if (other.gameObject.CompareTag("Player") && this.gameObject.CompareTag("TrialEnter") && other.isTrigger) 
         {
             isPlayerInTrial = TrialState.enter;
             StartCoroutine(spawn);
             StartCoroutine(timer);
         }
         if (other.gameObject.CompareTag("Player") && this.gameObject.CompareTag("TrialExit") && other.isTrigger) 
         {
             isPlayerInTrial = TrialState.exit;
         }
     }
 
     // AddEnemy() and CreateTimer() routines
 }


But again, the same result yielded from this approach. Where can I be wrong? Am I not understaing how StopCoroutine works?

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

0 Replies

· Add your reply
  • Sort: 

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

160 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

Related Questions

Pipe Game ... I have to trace water from source to destination 2 Answers

When is OnTriggerExit2D called? 1 Answer

Can I know which exactly of an object's collider resulted in OnTriggerEnter()? 0 Answers

Long question about animation and triggers working strange 0 Answers

ontriggerenter triggering at the wrong time 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