Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unity IsPointerOverGameObject Issue

I know it's a common problem but none worked. Maybe the button setup is wrong. I have a Panel with no image, and inside a settings button on the top left that once clicked opens another scene. I tried using those 3 methods but none works. It always detects it as a Game object.

The bool isGameStarted is checking if the player should move or no. Please guide me through

Have tried

if (Swipe.Instance.Tap && !isGameStarted)
{
    if (EventSystem.current.IsPointerOverGameObject() )
    { 
        isGameStarted = false;
    }
    else
    {
          isGameStarted = true;
          motor.StartRunning();
          gameCanvas.SetTrigger("Show");
    }
}

Also tried using trigger but it goes through the UI.

This is the original code.

if (Swipe.Instance.Tap && !isGameStarted)
{ 
    isGameStarted = true;
    motor.StartRunning();
    gameCanvas.SetTrigger("Show");
}

Once you tap on the screen the player starts moving. I need it NOT to move or start the game if clicked on the settings button.

like image 616
Danny Avatar asked Nov 26 '25 18:11

Danny


1 Answers

I had the same problem until I figured out that IsPointerOverGameObject seems to return true for any GameObject (possibly with a collider) and not only UI objects.

So I wrote a custom static class to check for UI objects only. You will need to set the layer of each panel, image, button, etc. to UI for it to work.

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public static class MouseOverUILayerObject
{
    public static bool IsPointerOverUIObject()
    {
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

        for (int i = 0; i < results.Count; i++)
        {
            if (results[i].gameObject.layer == 5) //5 = UI layer
            {
                return true;
            }
        }

        return false;
    }
}

Use it like this:

private void OnMouseDown()
{
      if (!MouseOverUILayerObject.IsPointerOverUIObject())
            HandleClick();
}
like image 104
TobiasF Avatar answered Nov 29 '25 07:11

TobiasF



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!