比如战斗场景,UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了3D部分。为了解决这个问题在判断3D响应之前要先判断手指是否点击在UI上。 以前NGUI的时候都是自己来发送射线判断,现在UGUI好了系统提供了更为简便的方法。
#if UNITY_ANDROID && !UNITY_EDITOR
#define ANDROID
#endif
#if UNITY_IPHONE && !UNITY_EDITOR
#define IPHONE
#endif
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
void Update()
{
if (Input.GetMouseButtonDown(0)||(Input.touchCount >0 && Input.GetTouch(0).phase == TouchPhase.Began))
{
#if IPHONE || ANDROID
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
#else
if (EventSystem.current.IsPointerOverGameObject())
#endif
Debug.Log("当前触摸在UI上");
else
Debug.Log("当前没有触摸在UI上");
}
}
}
这段代码我在Android上已经测试通过。 哦 我用的是unity5.1
- 本文固定链接: https://www.xuanyusong.com/archives/3327
- 转载请注明: 雨松MOMO于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

雨松三三你好,5.1可用。实际应用中会有这个情况,有些ui例如按钮,需要判断是否点击在ui上。还有一些 ,例如显示信息的标签,不需要判断是否点击在ui上,如何在程序中将两者区分。
我以前 采取的方案是 将没有图案的rectTransform覆盖至需要判断的按钮列上,然后计算出rectTransform的四个顶点坐标,通过判断鼠标是否在rectTransform的区域内来得出结果。效果很好但很麻烦。
这里希望能得到一种更简便的方式。所以想知道 如何将需要进行判断的ui和不需要进行判断的ui区分。
试了您给的链接中Android的监测方法,貌似还是不行哎,能否麻烦您写一个可行的方法?
补充在博客里了。。
Unity5.0 Android测试未通过
,不过找到一个通过射线的方法可行的。 bool CheckGuiRaycastObjects() { PointerEventData eventData = new PointerEventData(eventSystem); eventData.pressPosition = Input.mousePosition; eventData.position = Input.mousePosition; List list = new List(); graphicRaycaster.Raycast(eventData, list); //Debug.Log(list.Count); return list.Count > 0; }
你试试5.1吧。 或者升级到5.2 .5.0 bug很多啊
之前就发现5.1.x的Version Control是灰色的,然后就没有升级。这个怎么解?
Unity5上这个方法在真机上不好使啊,我用判断currentSelectedGameObject是否为空替代了。。。不知道是不是我的用法有问题
谢谢 松神。。
这个方法只能检测到脚本挂载在的GameObject的上方的UI,有其它GameObject遮挡就无效了。。
刚刚测试之后发现,要把ui的ray target打开才行
如果是想拖动背包里面很多个ui中的某一个 应该咋办呢 是不是只能用射线
UGUI 如何做出鼠标经过文本UI时,出现提示信息,离开消失。
ugui 有这个事件啊
是弹出tooltip这种的,只找到动画机的方式,
EventSystem.current.IsPointerOverGameObject()标红色啊,报错了,怎么解决呢
可能是unity版本升级把名子变了吧。。
我用的4.5版本的啊,呜呜……怎么办呢
用射线可以吗?
可以啊
求解释,想用在手机上,谢谢啦
这个EventSystem.current.gameObject.name 返回的值为什么一直就是EventSystem?
http://www.4yue.net/?post=116这个方法 你看看http://www.4yue.net/?post=116这个方法 你看看
不错, 新方法, 有空试试。。。
话说,射线 根本 检测不到 ui层,咋搞
为什么检测不到UI层呢?看24楼的方法http://forum.unity3d.com/threads/ispointerovereventsystemobject-always-returns-false-on-mobile.265372/
借个帖子发个问题,雨大大,我在将一个大地形切割成若干个小地形时候,这个大地形是有光照贴图的,生成的若干个小地形需要赋值这个光照贴图的各个部分,怎么赋值呢,我找了好久没没找到怎么赋值。
动态换光照贴图。
额,这个我知道,原本是的光照贴图是一张整的地形光照图,现在几个若干小地形要做个偏移什么的吧。Renderer里面有lightmapScaleOffset 和lightmapIndex。但是Terrain.lightmapIndex 就这一个属性没有 lightmapScaleOffset 光照贴图平铺偏移属性,我怎么做偏移呢?
正在把游戏中的NGUI转成UGUI,遇到了好多坑。。其中一个是新手引导中设置焦点,屏蔽其他交互的问题。NGUI中可以用Event Mask做。UGUI中找到个类似的东西,叫Graphics Raycaster,其中可以设置Block Mask。可是我发现设置了Block Mask也不起作用,并没有屏蔽其他layer,是我使用方法有问题?
看了下Graphics Raycaster的代码,发现这个Block Mask是用来计算需要响应Raycaster的最小hitDistance的,2D UI没有distance这个概念,那么这个Block Mask对2D UI就没啥用了。。还是得找其他方法解决啊
我有一个想法 不知道可行不? 新手引导的时候 取出只响应点击的按钮的区域。。抠出来的地方也就是四个透明的矩形。。四个透明矩形深度放在最前面就可以挡住别的UI事件了。。
感谢回复!您这个方法可行的,多谢了!我刚想到个更简单一些的,Graphics Raycaster的Raycast是个虚函数,可以写个Graphics Raycaster的派生类,在默认的Raycast操作执行完以后,用自定义的layer进行筛选,把不需要响应的gameobject去掉。这样就可以实现只响应某个layer的需求了。新手引导中只要把需要响应的gameobject设置为特定layer就行了。
嗯 好得。。
怎么写的求教ლ(°◕‵ƹ′◕ლ)
怎么写的求教?(°?‵?′??)
可以把代码私信看一下吗?小白实在是头疼。
我用canva提高层级高亮具体对象的时候遇到事件穿透问题。。。。
急求教新手引导问题,遇到很多坑
需要这么麻烦吗?我用的NGUI,设置下NGUI的Camera的UI Mask就可以了啊,主摄影机的Mask去掉UI层,互不干扰的。
前辈,模拟器上市可以的,真机上还是会影响到3D部分,您知道这是什么原因吗
我在真机上看了 没遇到你说的啊。。
前辈 可是我这边的真机上确实还能穿透 任何一个手机都能穿透 ,是因为我有些地方设置错了?
模拟器上跑的很好 ,可是一到真机上就不行了
前辈 已解决
兄弟,我遇到了和你一样的问题这是怎么回事呢,请问你是如何解决的?
前辈 我也遇到了这样的问题,模拟器上市可以的,真机上还是会影响到3D部分,是否还有其他要设置的呢
请教下大大1.UGui如何像以前一样获得GetScreenRect();2.做人物头顶的血条以前一直用的老的 转屏幕坐标绘制,用uGUI 有什么好的思路?
实现 IPointerClickHandler接口 可以实现。
请问 未来的一年的UGUI 系统能取代NGUI吗?
我觉得能。。
我的4.6b18没找到EventSystem.current.IsPointerOverGameObject()原文的 EventSystemManager.currentSystem.IsPointerOverEventSystemObject()编译通过,也切实可行。感谢momo
我的是4.6 21 。。。
原来这是4.6的,怪不得查了半天手册也没找到eventsystem
if (UICamera.lastHit.collider == null) 这样判断会更好
NGUI的吧。。 准备废弃NGUI了。。