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 /
avatar image
0
Question by Dellgloom · Feb 19, 2015 at 11:35 AM · raycastmousecoroutineloopwhile

Waiting for a mouse click in a Coroutine

Hello,

I am in the middle of creating a Finite State Machine for a quick AI demo. One of my states "Idle" is to continuously check for the selection of a game object taken by a mouse click, which then transitions into "Walking", where the agent begins to path find towards the selected object.

I decided to use Coroutines to solve this, and have come up with a function like this:

     IEnumerator WaitForInstruction()
     {
         while(true)
         {
             if(Input.GetMouseButtonDown(0))
             {
                 RaycastHit hit = new RaycastHit();
                 if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
                 {
                     if(hit.transform.gameObject.tag == "Target")
                     {
                         testTransform = hit.transform;
                         ExitState();
                         Debug.Log ("I hit you");
 
                         currentState = State.Walking;
                         EnterState();
                         yield break;
                     }
                 }
             }
         }
         yield return null;
     }

This is causing my Unity to just crash as soon as its run. Its obvious why this is happening, its getting stuck forever inside the while loop because the condition to break out of it is not being met, however due to the crashing, its impossible to give it any mouse input to break out.

I'm quite new to Unity scripting so there might be something I don't understand about coroutines and how they work. Is there an obvious way that I am missing to get this functionality without it hanging?

Thanks for any help. :)

Comment
Add comment · 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 akpriest · May 25, 2017 at 05:00 PM 0
Share

Hello, I just had a question related to your code. What are your EnterState() and ExitState() functions? Are they related to your animator?

1 Reply

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

Answer by Tuncer · Feb 19, 2015 at 11:40 AM

yield return null; is at the wrong place, it is needed to be in while loop.

 IEnumerator WaitForInstruction()
 {
     while(true)
     {
         if(Input.GetMouseButtonDown(0))
         {
             RaycastHit hit = new RaycastHit();
             if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
             {
                 if(hit.transform.gameObject.tag == "Target")
                 {
                     testTransform = hit.transform;
                     ExitState();
                     Debug.Log ("I hit you");
                     currentState = State.Walking;
                     EnterState();
                     yield break;
                 }
             }
         }
         yield return null;
     }
     //not here yield return null;
 }

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 Dellgloom · Feb 19, 2015 at 12:03 PM 0
Share

Thank you very much, I knew it would be something stupid. I guess I need to get my head around this coroutine stuff.

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

4 People are following this question.

avatar image avatar image avatar image avatar image

Related Questions

Unity crashes when using while 2 Answers

Stop Current Coroutine, Then Restart It 1 Answer

StopCoroutine() is not stopping my coroutines 1 Answer

Coroutine While loop help 2 Answers

While loop crashing Unity 2 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