- Home /
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???
Answer by zharik86 · Jan 01, 2014 at 03:51 PM
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;
}
}
}
Answer by lermy3d · Mar 24, 2015 at 07:58 PM
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!