GUI Menu Esc Button to Show and Hide it?

I want to show and hide a GUI box by pressing the Esc key. Why doesn’t this script work?

#pragma strict
var IsPaused : boolean = false;
var Width = 250;
var Height = 300;
private var rect = Rect((Screen.width-Width)/2, (Screen.height-Height)/2, Width, Height);

function Start ()
{
	IsPaused = false;
}

function Update () 
{
	if (Input.GetKeyDown(KeyCode.Escape))
	{
		Screen.showCursor = true;
		IsPaused = true;
	}
	
	if (IsPaused)
	{
		if (Input.GetKeyDown(KeyCode.Escape))
		{
			Screen.showCursor = false;
			IsPaused = false;
		}
	}
}

function OnGUI ()
{
	if (IsPaused)
	{
		GUI.Box (rect, "Options");
	}
}

This script should show the GUI box when I press Esc and set IsPaused to true. When IsPaused is true it should check if I press the Esc key again and close the GUI box. What it does is not bring the box up. I’m guessing it is because when IsPaused becomes true I still have the Esc key pressed for a second. I’m guessing the only ways to fix this is to either check GetKeyUp instead or to wait a second to check if IsPaused is true and then close the GUI box. Or is there another way???

In your situation I can offer two candidate solutions. The first, simply make one condition of ‘if’:

if (Input.GetKeyDown(KeyCode.Escape)) {
   Screen.showCursor = !Screen.showCursor;
   IsPaused = !IsPaused;
}

The second decision is to enter a certain variable, whether which defined the ESC key was reaped.

 private bool myflag = false;
 ...
 function Update() {
  myflag = false;
  if (Input.GetKeyDown(KeyCode.Escape) && !myflag && !IsPaused) {
   Screen.showCursor = true;
   IsPaused = true;
   myflag = true;
  }

  if (IsPaused) {
   if (Input.GetKeyDown(KeyCode.Escape) && !myflag) {
     Screen.showCursor = false;
     IsPaused = false;
     myflag = true;
   }
  }
 }

Hello I guess that what you are trying to achieve is this:

bool isInTransition = false;

void Update()
{
    if(Input.GetKeyDown(KeyCode.Escape)
       HandleMenu();
}    

public void HandleMenu()
{
	if(!isInTransition)
	{
		//toogle input
		IsPaused = !IsPaused;
		
		//toogle menu
		MainMenu.SetActive(!MainMenu.activeSelf);

		isInTransition = true;

		StartCoroutine(WaitDisableTransition());
	}
}

IEnumerator WaitDisableTransition()
{
	//doesn't work with Time.timeScale = 0
	yield return new WaitForSeconds(0.35f);
	
	//alternative when Time.timeScale = 0
//	float time = Time.realtimeSinceStartup;
//	while(Time.realtimeSinceStartup - time < 0.35f)
//		yield return new WaitForEndOfFrame();
	
	DisableTransition();
}

public void DisableTransition()
{
	isInTransition = false;
}

This has being a pain since there are not too many tutorials that actually cover or address this so common behaviour in every day games.

Anyways, hope it help the future generations!