比如战斗场景,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 40 41 |
#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的名呢?