XUnity

Unity IsPointerOverGameObject的一个

2019-10-12  本文已影响0人  Wwnje

需求

        if (Input.GetMouseButtonDown(0))
        {
            IsOverGameObject = EventSystem.current.IsPointerOverGameObject();
            if (IsOverGameObject)
            {
                Debug.Log("Click the UI");
                return;
            }

            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray.origin, ray.direction, out RaycastHit hit, float.MaxValue))
            {
                if (null != hit.collider)
                {
                    Debug.LogError(hit.collider.name);
                }
            }
        }

解析

        public override bool IsPointerOverGameObject(int pointerId)
        {
            var lastPointer = GetLastPointerEventData(pointerId);
            if (lastPointer != null)
                return lastPointer.pointerEnter != null;
            return false;
        }

关键在于lastPointer.pointerEnter != null这句代码,如果在自己的UI上挂脚本并实现以下代码

    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("OnPointerEnter");
    }

会发现在上面有问题的代码下,从其他地方重新点击到unity游戏窗口,并点击物体,物体名字的log在OnPointerEnter log的前面,所以验证了unity内部判断是否点到ui实际上是判断是否OnPointerEnter了UI,但是遗憾的是这个顺序是不固定的。所以一旦是不固定的顺序,那么IsPointerOverGameObject在某些情况下会失灵。

解决

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            IsOverGameObject = EventSystem.current.IsPointerOverGameObject();
            if (IsOverGameObject)
            {
                Debug.Log("Click the UI GetMouseButtonDown");
                return;
            }
        }

        if (Input.GetMouseButtonUp(0))
        {
            IsOverGameObject = EventSystem.current.IsPointerOverGameObject() || IsOverGameObject;
            if (IsOverGameObject)
            {
                Debug.Log("Click the UI GetMouseButtonUp");
                return;
            }

            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray.origin, ray.direction, out RaycastHit hit, float.MaxValue))
            {
                if (null != hit.collider)
                {
                    Debug.LogError(hit.collider.name);
                }
            }
        }
    }

再次运行游戏就发现第一次隔离UI是被GetMouseButtonUp捕捉到了

上一篇下一篇

猜你喜欢

热点阅读