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. :slight_smile:

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;
}