Unity关于IsPointerOverGameObject接口真机失效问题

在制作游戏时,有时需要发射射线执行游戏的相关功能,但是在点击UI的同时,却也会触发游戏内的相关功能,为了规避此事件的发生,Unity提供了一个名为EventSystem.current.IsPointerOverGameObject()的函数,使用这个函数可以规避点在UI上依旧会触发游戏功能。但是在电脑上运行无误,打包成apk到真机上之后,这个函数会失效。

所以我们用如下代码对此接口进行优化,示例代码如下:

   public static bool IsPointerOverGameObject()
        {
     
            PointerEventData eventData = new PointerEventData(UnityEngine.EventSystems.EventSystem.current);
            eventData.pressPosition = Input.mousePosition;
            eventData.position = Input.mousePosition;
            List<RaycastResult> list = new List<RaycastResult>();
            UnityEngine.EventSystems.EventSystem.current.RaycastAll(eventData, list);
            return list.Count > 0;
        }

调用优化后的接口即可

    if (IsPointerOverGameObject() == false)

此接口多数情况下工作正常,但是有一种情况会失效。当点击关闭按钮关闭某个界面或UI时。还是会出现点到UI,界面顺利关闭的情况下触发游戏功能。解决方法只能延缓界面的关闭。示例代码如下:

   public void CloseChangeWindow()
    {
     
       Invoke("RealClose",0.1f);
    }

    private void RealClose()
    {
     
        ChangeWindow.SetActive(false);
    }

如有更好的解决方法欢迎留言探讨。

你可能感兴趣的:(unity)