GUI.Button works in editor but not on Mobile device

the following is a simplification of a problem I ran into during a project, and could not figure out. I opened a new project and reproduced the problem in an empty scene, so i know it is not a problem caused by any of my other code.

there is a script which draws a button in the corner of the screen. if this button is pressed, it will set the public boolean “pressed” to true, and will set it false other wise. this script is attached to an empty game object in the scene

using UnityEngine;
using System.Collections;

public class testButton : MonoBehaviour {
	public bool pressed;
	
	void OnGUI(){
		if(GUI.Button(new Rect(0,0,400,400),"test")){
			pressed=true;
		}
		else{
			pressed=false;
		}
	}
}

on another game object is attached this script

using UnityEngine;
using System.Collections;

public class testscript : MonoBehaviour {

	public GameObject testObject;
	testButton button;
	
	void Start(){
		button=testObject.GetComponent<testButton>();
	}

	void Update () {
		if (button.pressed){
			Handheld.Vibrate();
		}
	}
}

testObject is the gameobject in the scene which the testButton script is attached to, assigned in the editor. this script simply checks if the member variable pressed is true, and calls handheld.vibrate().

this scene runs as expected in the editor, but when i build and run in on my mobile device (a Droid DNA), the phone does not vibrate when the button is pressed.

if the call to handheld.vibrate() is placed within the if statement inside OnGUI() in testButton, the button responds. I am at a loss.

P.S. this is my first question asked on these forums, so please excuse any inelegance or ignorance of protocol. i only ask this question because i couldn’t figure it out and could not find an answer anywhere.

OnGUI is called multiple times per frame. It is actually THE event handling routine In Unity. GUI.Button will only return true during the mouse up event. If you want to use the event in another script, don’t reset the variable in OnGUI. Just set it to true, you can reset it in your other script.

Another way would be to use a delegate to which the other script can subscribe itself. Sorry but I can’t provide sample code at the moment because I’m writing on my tablet :slight_smile:

BTW: things like that can easily be tested by putting some Debug.Logs in your code.