比如战斗场景,UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了3D部分。为了解决这个问题在判断3D响应之前要先判断手指是否点击在UI上。 以前NGUI的时候都是自己来发送射线判断,现在UGUI好了系统提供了更为简便的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#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.4版本,鼠标点击的时候,这个判断是有效的,但是不知道为啥鼠标抬起的时候这个判断却无效,有没有什么方式可以判断到抬起的时候是否在UI上面?
因为GetMouseButtonDown不是GetMouseButtonUp
MOMO大神,我用了上面的方法,点击3D物体,也会提示触摸在UI上。因为我的3D事件是在MainCamera上添加了个PhysicsRaycaster实现的,这种情况,3D的事件触发也是通过EventSystem,就没法区分是不是UI了吧?是不是要添加layer的判断?
厉害了!谢谢!!
unity5.6运行没有问题。如果是要运行在手机上,将 IPHONE || ANDROID 替换为 UNITY_ANDROID || UNITY_IPHONE,接着再打包到手机上,是可以检测到UI的。
5.5版本,编译通过!多个UI,判断是否点击在当前UI上。修改:#if UNITY_IPHONE || UNITY_ANDROID,如果不修改,判断代码无法通过。
如果只是要判断“当前”image是否点击可以用IPointerDownHandler,普通ui好用了吧public class JoystickUI : MonoBehaviour, IPointerDownHandler,IPointerClickHandler{作为一个普通程序员,在update里面写太多东西,会后怕,不是不可以写,网上例子都是这么写的,但是真的前提是你要写对,和无数次测试和实践
还是雨松这里靠谱啊,网上都是些raycast的文章,拜托,真的搞项目的时候UI多过3D很多,请行外人先搞明白2D再3D吧,一上来就搞3D,就算你搞懂了,。。。。其实也没办法搞懂的,因为一开始方向就错了,出来的结果也是错的,也没法很完整的想法分享,没分享没进步。
我的场景中有多个UI,我在其中一个UI上加载了脚本,结果所有的UI都执行了脚本,我该如何获取触摸到的ui的名呢?
雨松三三你好,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了。。