- Home /
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. :)
Hello, I just had a question related to your code. What are your EnterState() and ExitState() functions? Are they related to your animator?
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;
}
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
Follow this Question
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