GUI script giving weird error

This GUI script gives me a weird error. It shows up on screen and I can press the buttons and they will change the variable as they are supposed to. But after that the script won’t continue.

	public void ChooseMove() {
		if (isPlayer) { //If it's the player, show the GUI
			showGUI=true;
			OnGUI ();
				} else { //If it's the computer, make a random choice
			int rand = Random.Range(0,2);
			currentMove = moves[rand];
				}
	}

	void OnGUI () {
		if (showGUI) {
						GUI.Box (new Rect (10, 10, 100, 140), "");
			
						if (GUI.Button (new Rect (20, 40, 80, 20), "Attack")) { //MAKE ATTACK BUTTON
								currentMove = "Attack";
								showGUI = false;
						}
			
						if (GUI.Button (new Rect (20, 70, 80, 20), "Defend")) { //MAKE DEFEND BUTTON
								
								currentMove = "Defend";
								showGUI = false;
						}
						if (GUI.Button (new Rect (20, 100, 80, 20), "Spell")) { //MAKE SPELL BUTTON
								
								currentMove = "Spell";
								showGUI = false;
						}
						if (GUI.Button (new Rect (20, 130, 80, 20), "Run")) { //MAKE RUN BUTTON
							
								currentMove = "Run";
								showGUI = false;
						}
				}
	}

and the error:

ArgumentException: You can only call GUI functions from inside OnGUI.
UnityEngine.GUIUtility.CheckOnGUI () (at C:/BuildAgent/work/d63dfc6385190b60/artifacts/EditorGenerated/GUIUtility.cs:229)
UnityEngine.GUI.Box (Rect position, UnityEngine.GUIContent content, UnityEngine.GUIStyle style) (at C:/BuildAgent/work/d63dfc6385190b60/artifacts/EditorGenerated/GUI.cs:373)
UnityEngine.GUI.Box (Rect position, System.String text) (at C:/BuildAgent/work/d63dfc6385190b60/artifacts/EditorGenerated/GUI.cs:366)
MobInfo.OnGUI () (at Assets/MobInfo.cs:42)
MobInfo.ChooseMove () (at Assets/MobInfo.cs:33)
TurnBasedSystem.Combat (.MobInfo encounter1, .MobInfo encounter2) (at Assets/TurnBasedSystem.cs:46)
Collision.OnTriggerEnter (UnityEngine.Collider other) (at Assets/Collision.cs:10)

As you can see in the error the call for OnGUI is derived in multiple steps, and the code freezes at the first instance of the call (the function “TurnBasedSystem.Combat()” won’t continue).

Don’t call OnGUI(), the Unity engine will call it multiple times, just ensure your logic is sound in the method.

Let me go further. If you call OnGUI explicitly, this is not the same as the Unity Engine calling OnGUI, so you’re making calls out side of the GUI functions by calling manually. Where as you can have methods that get called in OnGUI that contain GUI methods, but it must be called by the Engines state machine.

Also be aware that the OnGUI method can be called multiple times per frame to ensure input smoothness.

From the Documentation:

This means that your OnGUI implementation might be called several times per frame (one call per event). For more information on GUI events see the Event reference. If the MonoBehaviour’s enabled property is set to false, OnGUI() will not be called.