Unity3D开发之判断鼠标是否在UI上

unity给我们提供了一条api。

EventSystem.current.IsPointerOverGameObject()==true

他是利用unity的EventSystem事件系统判断射线是否射到物体上。我们查看官方文档可以看到继承BaseRaycaster的有三个组件,.PhysicsRaycaster, Physics2DRaycaster, GraphicRaycaster,所以当我们项目中只有canvas自带的GraphicRaycaster时,我们可以使用上述api判断鼠标是否在UI上。但是当我们场景camera上挂有PhysicsRaycaster,则判断完全会出现问题。我们会发现鼠标移动到含有collider的3D物体上以上API也会返回true。此时我们需要自己写一个射线检测的方法来判断是否在UI上。

我们可以将方法写在静态工具类里供全局调用。

#region 是否点击在UI上
        private static GraphicRaycaster graphicRaycaster;
        private static EventSystem eventSystem;
        private static PointerEventData eventData;
        private static bool init = false;

        static void Init()
        {
            if (!init)
            {
                graphicRaycaster = GameObject.Find("UI").GetComponent();//这里要根据你自己的项目自己找canvas上的GraphicRaycaster
                eventSystem = EventSystem.current;
                eventData = new PointerEventData(eventSystem);
                init = true;
            }
        }
        /// 
        /// 是否在UI上
        /// 
        /// 
        public static bool IsOnUIElement()
        {
            Init();
            if (graphicRaycaster == null)
            {
                Debug.Log("无GraphicRaycaster,有问题");
                return false;
            }
            eventData.pressPosition = Input.mousePosition;
            eventData.position = Input.mousePosition;
            List list = new List();
            graphicRaycaster.Raycast(eventData, list);
            foreach (var temp in list)
            {
                if (temp.gameObject.layer.Equals(5)) return true;
            }
            return false;
        }
        #endregion

 

你可能感兴趣的:(Unity)