美文网首页U3D技术采集Unity基础
unity 之UGUI 屏蔽鼠标穿透

unity 之UGUI 屏蔽鼠标穿透

作者: 游戏开发小Y | 来源:发表于2017-03-22 10:08 被阅读90次

    在Unity推出UGUI后,很多人开始使用UGUI,的确使用者很方便,毕竟是亲生的。

    但是有时候做3D物体射线点击的时候,或者获取OnMouseDown的时候,发现即便鼠标(手指)点击了UI,但是射线和OnMouseDown依然会相应。这个怎么避免呢?

    下面直接上代码吧,只需要在Update中加入这个方法就行了。

    01.void Update()  
    02.{  
    03.    if(IsTouchedUI())  
    04.    {  
    05.        Debug.Log("当前触摸在UI上");  
    06.    }  
    07.    else  
    08.    {  
    09.        Debug.Log("当前没有触摸在UI上");  
    10.    }  
    11.}  
    12.void OnMouseDown()  
    13.{  
    14.   if(IsTouchedUI())  
    15.    {  
    16.        Debug.Log("当前触摸在UI上");  
    17.    }  
    18.    else  
    19.    {  
    20.        Debug.Log("当前没有触摸在UI上");  
    21.    }  
    22.}  
    23.  
    24.bool IsTouchedUI()  
    25.{  
    26.    bool touchedUI = false;  
    27.    if (Application.isMobilePlatform)  
    28.    {  
    29.        if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))  
    30.        {  
    31.            touchedUI = true;  
    32.        }  
    33.    }  
    34.    else if (EventSystem.current.IsPointerOverGameObject())  
    35.    {  
    36.        touchedUI = true;  
    37.    }  
    38.    return touchedUI;  
    39.}  
    

    应该不需要注释了,现在我们只需要在没有触摸UI的时候进行射线检测或者其他操作就行了。

    虽然官方为我们提供了这么一套接口,但是亲测在Android 手机上并不能用,猜测应该是unity官方的bug。静待官方修复。

    后来为了在Android机上进行UI防止穿透,我又写了一套全平台通用的代码

    01. void OnMouseDown()  
    02.    {  
    03.       if(!IsPointerOverGameObject(Input.mousePosition))  
    04.        {  
    05.           //没有点击UI  
    06.        }  
    07.    }   
    
    01.public bool IsPointerOverGameObject(Vector2 screenPosition)  
    02.    {  
    03.        //实例化点击事件  
    04.        PointerEventData eventDataCurrentPosition = new PointerEventData(UnityEngine.EventSystems.EventSystem.current);  
    05.        //将点击位置的屏幕坐标赋值给点击事件  
    06.        eventDataCurrentPosition.position = new Vector2(screenPosition.x, screenPosition.y);  
    07.  
    08.        List<RaycastResult> results = new List<RaycastResult>();  
    09.        //向点击处发射射线  
    10.        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);  
    11.  
    12.        return results.Count > 0;  
    13.    }  
    

    也就是说,我们将IsPointerOverGameObject统一修改为自己重载的方法,然后穿进去Input.mouseposition。就可以了。

    相关文章

      网友评论

        本文标题:unity 之UGUI 屏蔽鼠标穿透

        本文链接:https://www.haomeiwen.com/subject/dtznnttx.html