Unity点击UI时不触发场景物体的响应

发表于2018-12-28
评论0 812浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏美术行业精英群

167422913
场景描述:有一个canvas,为spaceoverlay格式,有若干panel、button子物体;有一个terrain,具有碰撞器;

事件描述:点击屏幕,在点击位置生成一个小圆球,拖动小圆球可以改变位置,选中小圆球可进行删除操作;

问题描述:点击UI控件时,场景中不生成小圆球,也不会触发任何小圆球的响应时间。

下面给出三种方法:

1、对于点击UI时不出发场景物体的响应,网上绝大部分回答都是使用EventSystem.current.IsPointterOverGameObect进行判断,此语句的意思是碰到UI返回true,碰到3D objects返回false,我在unity中进行制作的时候一直都是这么用,在unity中运行良好,所以一直都以为高枕无忧,代码如下,事实上如果你要求不高这样子的确是最简单的做法。
if (Input.GetMouseButtonDown (0)) {
    if (EventSystem.current.IsPointerOverGameObject ()) {
	Debug.Log ("touch area is UI");}
    else { //XXX}

2、然而,我制作的是一个安卓应用,当我发布到安卓手机上后,奇怪的问题就出现了,有时候点击UI,效果很好,但有时候屏幕发出的射线没有被UI阻挡掉,造成我点击按钮也在场景中生成了一个小球,这说明上述的方法在安卓上并不能完美运行。

我试过网上所说的大部分方法,比如添加canvasGroup,无效,因为其只针对UI有效;试过在button上面再放一个panel,取消勾选panel的raycaster target,期望它能阻挡住射线,然而依然无效;还有其他的比如为摄像机添加physics raycaster,将事件改成event trigger,这个并不符合我的场景要求。

最后决定从代码入手增加一个判断是否为UI的方法,代码如下:
private bool IsPointerOverUIObject() {//判断是否点击的是UI,有效应对安卓没有反应的情况,true为UI
	PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
	eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
	List<RaycastResult> results = new List<RaycastResult>();
	EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
	return results.Count > 0;
	}

在需要判断的位置使用此方法进行判断:
if(!IsPointerOverUIObject()){
    //XXX} 
通过这个方法完美解决手机上触碰ui控件时触发3D物体响应事件的问题,ios也可以使用。比第一步的方法要可靠很多。

3、
 if (EventSystem.current.IsPointerOverGameObject() ||
     EventSystem.current.currentSelectedGameObject != null) {
         return;
 } 
这个方法在第一步的基础上强化了,也比较适用,但是第二步的方法会更可靠一些,尤其是在安卓上。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台