U3D技术采集Unity基础

unity 之UGUI 屏蔽鼠标穿透

2017-03-22  本文已影响90人  游戏开发小Y

在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。就可以了。

上一篇下一篇

猜你喜欢

热点阅读