- Home /
GUI Click and Hide
I need to let GUI appear when i click a game object but when i click anything else it should disappear, but every time i click on the GUI it disappears and doesn't register my click.
if (Physics.Raycast(ray, hit)) {
if (hit.collider.name == "fruit" && Input.GetMouseButtonDown(0)) {
justClicked = hit.collider.name;
Debug.Log("hit");
clicked = true;
xGui = Camera.main.WorldToScreenPoint (hit.collider.transform.position);;
}
else if (hit.collider.name != "fruit" && Input.GetMouseButtonDown(0)) {
clicked = false;
}
}
}
function OnGUI () {
if (clicked == true) {
if(GUI.Button(Rect(xGui.x, xGui.y, 100, 100), "Do something")) {
Debug.Log("Clicked");
}
}
}
For some weird reason if I don't move the GUI with xGui it registers the click. Thanks in advance :) Bernard
Answer by robertbu · Jun 05, 2013 at 02:00 PM
Your problem is that when you place your GUI.Button, it is over another game object (without a fruit label). So when you click to activate the button, your Physics.Raycast() code is executed first bringing the button down. You can fix it with something like:
#pragma strict
var clicked = false;
var justClicked : String;
var xGui : Vector3;
function Update() {
var hit : RaycastHit;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, hit)) {
if (!clicked && hit.collider.name == "fruit" && Input.GetMouseButtonDown(0)) {
justClicked = hit.collider.name;
Debug.Log("hit");
clicked = true;
xGui = Camera.main.WorldToScreenPoint (hit.collider.transform.position);;
}
else if (hit.collider.name != "fruit" && Input.GetMouseButtonDown(0)) {
clicked = false;
}
}
else if (Input.GetMouseButtonDown(0)) {
clicked = false;
}
}
function OnGUI () {
if (clicked) {
if(GUI.Button(Rect(xGui.x, xGui.y, 100, 100), "Do something")) {
clicked = false;
Debug.Log("Clicked");
}
}
}
Thanks but now when I click somewhere else to "deselect" that game object and hide the GUI.Button nothing happens? Thanks for the speedy reply :)
I edited the code to give you more of what you want. The code is convoluted (I$$anonymous$$HO). When I get code like this, it usually means I have not though about the problem in the right way.
I don't know how your logic flows, but I might do something like this to solve your problem:
#pragma strict
private var show;
private var rect : Rect;
function On$$anonymous$$ouseDown() {
show = true;
rect = Rect(Input.mousePosition.x - 50, Screen.height - Input.mousePosition.y - 50, 100, 100);
}
function OnGUI () {
var e = Event.current;
if (e.type == EventType.$$anonymous$$ouseDown && !rect.Contains(e.mousePosition))
show = false;
if (show) {
if(GUI.Button(rect, "Do something")) {
show = false;
Debug.Log("Do something");
}
}
}
This would need to be attached to every "fruit" object.
Your answer
Follow this Question
Related Questions
How to get raycast hit coordinates on Cardboard 0 Answers
GUI display weapon name you are looking at 1 Answer
Drag gui text and drop it on 3d object. 0 Answers
Using GUI.tooltip to avoid executing code over GUI elements 3 Answers
Raycast needs to hit GUI 3 Answers