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

场景描述:有一个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 results = new List();
	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;
 }

这个方法在第一步的基础上强化了,也比较适用,但是第二步的方法会更可靠一些,尤其是在安卓上。


这个过程花了我一上午的时间,网上的错误答案五花八门,这个贡献出来希望对大家有用。

你可能感兴趣的:(unity)