Ignore Input.GetMouseButtonUp for clicks that were used on GUI elements

In Update() I use Input.GetMouseButtonUp(0) to detect mouse releases. I want the player to interact with my gameplay objects when the user releases the mouse button.

If the user clicks and releases a button in the GUI, my mouse-release code in Update() is called. But, I want to ignore these releases instead.

I can ignore mouse-button-down frames by checking GUIUtility.hotcontrol, but this doesn’t work for the mouse-button-up frame.

Is there any simple method to ignore GetMouseButtonUp frames that were used to click on a GUI element? Currently I’m looking at something like adding m_ignoreNextMouseUp = true after every single GUI.Button call.


void Update() {
    if (Input.GetMouseButtonUp(0)) {
        // Ignore this code if the user had mouse-downed on a GUI element.
    }
}

You can store the rectangles of all your GUI elements and iterate them through cehck if its true for any rects: rect.Contains(Input.mousePosition)
If it is, then ignore it

Looks like the “right” way to do this is to poll Events in OnGUI().

In the OnGUI() call where Event.current.type == Event.MouseUp, GUIUtility.hotControl can be reliably checked, even for MouseUp events. This is no longer true by the time Update() gets called, apparently.

So the solution for the original code:

void OnGUI() {
    if (Event.current.type == EventType.MouseUp && Event.current.button == 0 && GUIUtility.hotControl == 0) {
        // This code will be ignored if the user had mouse-downed on a GUI element.
    }
}