UI detections working on PC but not on Android

292 Views Asked by At

im creating an android map game and i cant solve a problem, i have a map and i also have a menu that pops up once i press on a gameobject with a collider. I had a problem that if i would press on that UI menu it would go throught it and it would turn the menu off, because i coded that if i press on another gameobject with a collider it would turn off. I fixed that by making a UI detection script (found it on google), where it draws a raycast from my cursor and detects a gameobject with a specific layer and returns a true or false value.

THE PROBLEM: Right now everything works fine on pc, since i am hovering with my cursor, but if i go on my unity remote once i press on the menu, it still turns off, because i guess its not quick enough to detect that its a UI element?

SOME CODE:

This is a UI Detection code:

    public bool isOverUI;

    private void Start()
    {
        UILayer = LayerMask.NameToLayer("MAINMENUCOMPONENTS");
    }

    private void Update()
    {
        print(IsPointerOverUIElement() ? "Over UI" : "Not over UI");
    }


    //Returns 'true' if we touched or hovering on Unity UI element.
    public bool IsPointerOverUIElement()
    {
        return IsPointerOverUIElement(GetEventSystemRaycastResults());
    }


    //Returns 'true' if we touched or hovering on Unity UI element.
    private bool IsPointerOverUIElement(List<RaycastResult> eventSystemRaysastResults)
    {
        for (int index = 0; index < eventSystemRaysastResults.Count; index++)
        {
            RaycastResult curRaysastResult = eventSystemRaysastResults[index];
            if (curRaysastResult.gameObject.layer == UILayer)
            {
                isOverUI = true;
                return true;
            }
        }
        isOverUI = false;
        return false;
    }


    //Gets all event system raycast results of current mouse or touch position.
    static List<RaycastResult> GetEventSystemRaycastResults()
    {
        PointerEventData eventData = new PointerEventData(EventSystem.current);
        eventData.position = Input.mousePosition;
        List<RaycastResult> raysastResults = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventData, raysastResults);
        return raysastResults;
    }

This is the menu code:

public UIDETECTIONS UID;

            if (UID.isOverUI == true)
            {

            }
            else if (UID.isOverUI == false)
            {
                if (infoMenuOn == false)
                {
                    if (isCountryClicked == false)
                    {
                        isCountryClicked = true;
                        infoMenuOn = true;
                        Debug.Log("MENU ON");
                    }
                    else if (isCountryClicked == true)
                    {
                        isCountryClicked = false;
                    }
                }
                else if (infoMenuOn == true && isCountryClicked == true)
                {
                    infoMenuOn = false;
                    isCountryClicked = false;
                    Debug.Log("MENU OFF");
                }
            }
1

There are 1 best solutions below

0
Redierro On

I Should have done more research :D, derHugo gave me a hint, which was kind of an answer. I found this piece of code which works for android. Works quite the same.

private 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);
     return results.Count > 0;
 }

With this code you can check if youre clicking over ui elements:

if (IsPointerOverUIObject() == true) // true or false