Calling IsPointerOverEventSystemObject works great in unity editor and standalone builds but on mobile devices (Android to be more specific) it always returns false.
Is this a bug or am I missing something here?
IsPointerOverEventSystemObject takes an int for the touch id. Mouse is the default (-1) use touch id’s to figure out if a certain finger is over a managed object.
Thanks Tim!
I had no idea IsPointerOverEventSystemObject took a touch id, I’ll give it another shot.
Is there a reference as to what touch ids are possible? Like, would 0 be first touch or something?
Also, wouldn’t it be easier to just not propagate touches through stuff, or make it a toggle?
No references as of yet but -1 if mouse and then the rest are the ids of Touch.fingerId
Anyone care to post a working example?
The most basic example would be something like this:
void Update ()
{
if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began) {
if (!EventSystemManager.currentSystem.IsPointerOverEventSystemObject (Input.GetTouch (0).fingerId)) {
//Handle Touch
}
}
}
Since 4.6 Beta 19, IsPointerOverEventSystemObject does not work anymore. Is this by design or just a bug?
This is what we were doing before to detect button touches:
// ...
EventSystem eventSystem = EventSystem.current;
return ( eventSystem.IsPointerOverEventSystemObject( fingerId )
&& eventSystem.currentSelectedObject != null );
…were fingerId is something in the range between -1 (mouse button) and Touch.fingerId.
The console says: "UnityEngine.EventSystems.EventSystem’ does not contain a definition for IsPointerOverEventSystemObject' and no extension method IsPointerOverEventSystemObject’ of type `UnityEngine.EventSystems.EventSystem’ could be found…"
The code worked fine with 4.6 Beta 17 and 18. Is there a workaround?
I believe it’s been changed to IsPointerOverGameObject(fingerId).
Thank you for the quick reply, adhdchris
I’ll try that later. Couldn’t find the information anywhere.
Have a look here…
Right… if only it was that simple. Unfortunately the release notes are far from thorough.
Very true!
That worked. Thanks again. Actually, I read the release notes several times but couldn’t find any information about this change. ![]()
EventSystem.currentSelectedObject is also not working anymore. It’s called EventSystem.currentSelectedGameObject now.
So for the sake of completeness, the code to test for UI button touches changed to:
bool IsPointerOverGameObject( int fingerId )
{
EventSystem eventSystem = EventSystem.current;
return ( eventSystem.IsPointerOverGameObject( fingerId )
&& eventSystem.currentSelectedGameObject != null );
}
Hi Bivrost
I’ve been having issues with getting the UI to block raycasts from touch input (on android) and this thread looks like the best lead I have so far to solve it. Here was the thread I made:
http://forum.unity3d.com/threads/how-to-make-ui-block-raycats-mobile.271978/#post-1820891
I would really appreciate getting a bit of your expertise on the code you provided above - I’m not quite sure where to put in in my code. I think it’s the answer to my problems, I just can’t put the pieces in place!
Thanks a lot
mickyg, just combine my previous answer on getting the touch id with Bivrost’s method (use foreach if you need multitouch):
void Update ()
{
if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began) {
if (IsPointerOverGameObject (Input.GetTouch (0).fingerId)) {
Debug.Log("Hit UI, Ignore Touch");
} else {
Debug.Log("Handle Touch");
}
}
}
bool IsPointerOverGameObject( int fingerId )
{
EventSystem eventSystem = EventSystem.current;
return ( eventSystem.IsPointerOverGameObject( fingerId )
&& eventSystem.currentSelectedGameObject != null );
}
The fact that you can finally detect touches on a button, is, seriously, one of the biggest advances for Unity in years! At last! Thanks for the clarification here Bivrost, good one
Thanks a bunch Chris, I had a setting ticked in the Event System (Allow Activation on Mobile Device) that was causing the code to not work. It’s solved now and working great - appreciate your quick reply!
I can’t make this solution work on 4.6.0f3 Android; was there a regression? Here’s my code:
// Ignore clicks that are over UI buttons or other visible UI elements
if (Input.touchCount > 0 && EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
// ignore click
but this does not work on Android because IsPointerOverGameObject() is always false. Input.touchCount and Input.GetTouch(0).fingerId all seem to be giving valid results. In fact I even tried calling IsPointerOverGameObject() for every value from -1 through 5 and the result is always false regardless of whether the click was on a UI element or not (in this case a Button).
Has anyone got this working with the new UI on Android + 4.6.0f3?
Wouldn’t it be better if we could do these tests with a simple Vector2 screen position - rather than having to know device-specific details of the touch/click?
It looks like there’s a raycast function - but it wants a PointerEventData as input, not simple coordinates - so it’s clearly not intended for this use.
Edit: Is this function returning true if the pointer is over any canvas object now? - I seem unable to create HUD elements that are ignored by this test, settings on Canvas Groups don’t seem to change anything…