Unity3D研究院之将UI的点击事件渗透下去(九十)
2017-03-28 18:07
337 查看
http://www.xuanyusong.com/archives/4241
处理UI还有3D模型的点击推荐使用UGUI的这套事件系统,因为使用起来比较简洁,不需要自己用代码来发送射线,并且可以很好的处理同时点击UI和3D模型上。
1.给3D摄像机挂一个Physics Raycaster组件。Event Mask过滤掉UI.
2.用unity自带的Event Trigger 或者 http://www.xuanyusong.com/archives/3325 就可以对UI 或者 3D模型进行点击事件的监听了
3.OK 当UI与模型相互叠加的时候,优先响应UI,并且响应最前面的UI.
4.如下图所示,前面是UI后面是3D模型,被挡住的模型或者UI是不会被响应的。
![](http://www.xuanyusong.com/wp-content/uploads/2016/09/Snip20160905_1.png)
假如想把点击的事件透下去,让所有的UI或者模型都能正确的响应事件,怎么办呢?
代码: 把这段脚本挂在最前面的UI上。 然后当接收到点击事件后,调用PassEvent把当前的事件透下去。由于UGUI的事件有很多种,比如点击 、抬起、拖动、落下、第二个参数就是ExecuteEvents.Handler 把对应的Handler传进去就行了。
C#
这样UI下面那些对应接收点击事件的地方都可以响应到了。。如下图所示,我点击在前面的UI后面的消息也能响应到了。
![](http://www.xuanyusong.com/wp-content/uploads/2016/09/Snip20160905_2.png)
本文固定链接: http://www.xuanyusong.com/archives/4241
处理UI还有3D模型的点击推荐使用UGUI的这套事件系统,因为使用起来比较简洁,不需要自己用代码来发送射线,并且可以很好的处理同时点击UI和3D模型上。
1.给3D摄像机挂一个Physics Raycaster组件。Event Mask过滤掉UI.
2.用unity自带的Event Trigger 或者 http://www.xuanyusong.com/archives/3325 就可以对UI 或者 3D模型进行点击事件的监听了
3.OK 当UI与模型相互叠加的时候,优先响应UI,并且响应最前面的UI.
4.如下图所示,前面是UI后面是3D模型,被挡住的模型或者UI是不会被响应的。
![](http://www.xuanyusong.com/wp-content/uploads/2016/09/Snip20160905_1.png)
假如想把点击的事件透下去,让所有的UI或者模型都能正确的响应事件,怎么办呢?
代码: 把这段脚本挂在最前面的UI上。 然后当接收到点击事件后,调用PassEvent把当前的事件透下去。由于UGUI的事件有很多种,比如点击 、抬起、拖动、落下、第二个参数就是ExecuteEvents.Handler 把对应的Handler传进去就行了。
C#
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 42 43 44 45 46 47 48 | using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using UnityEngine.UI; using System.Collections.Generic; public class Test : MonoBehaviour,IPointerClickHandler ,IPointerDownHandler,IPointerUpHandler { //监听按下 public void OnPointerDown(PointerEventData eventData) { PassEvent(eventData,ExecuteEvents.pointerDownHandler); } //监听抬起 public void OnPointerUp(PointerEventData eventData) { PassEvent(eventData,ExecuteEvents.pointerUpHandler); } //监听点击 public void OnPointerClick(PointerEventData eventData) { PassEvent(eventData,ExecuteEvents.submitHandler); PassEvent(eventData,ExecuteEvents.pointerClickHandler); } //把事件透下去 public void PassEvent<T>(PointerEventData data,ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler { List<RaycastResult> results = new List<RaycastResult>(); EventSystem.current.RaycastAll(data, results); GameObject current = data.pointerCurrentRaycast.gameObject ; for(int i =0; i< results.Count;i++) { if(current!= results[i].gameObject) { ExecuteEvents.Execute(results[i].gameObject, data,function); //RaycastAll后ugui会自己排序,如果你只想响应透下去的最近的一个响应,这里ExecuteEvents.Execute后直接break就行。 } } } } |
![](http://www.xuanyusong.com/wp-content/uploads/2016/09/Snip20160905_2.png)
本文固定链接: http://www.xuanyusong.com/archives/4241
相关文章推荐
- Unity3D研究院之将UI的点击事件渗透下去
- Unity3D之将UI的点击事件渗透下去
- Unity3D研究院之将UI的点击事件渗透下去(转)
- 【学习笔记】 Unity中在点击UI时屏蔽游戏内点击事件
- vue重温之mint-ui------------点击事件绑定
- 做项目过程中遇到的问题及解决----UIGesture手势与UI控件点击的事件冲突解决
- UI15-UIImageView响应点击事件
- IOS之UI--自定义按钮实现代理监听点击事件
- 【Android】【UI】ListView中Button点击事件被拦截的解决方案
- Unity3D插件之NGUI-确保鼠标点击UI时不响应其他事件
- 安卓UI学习(2)--能自定义点击事件,且带点击动画的按钮
- iOS--UICollectionView item不响应点击事件
- jQuery UI draggable(拖动)兼容移动端并且模拟click点击事件,兼容安卓
- UI控件无法响应点击等事件的探索
- vue+elementui怎样点击table中的单元格触发事件--弹框
- Android UI控件详解-Button(按钮)点击事件的5种写法
- IOS之UI--自定义按钮实现代理监听点击事件
- 如何自定义RecyclerView的点击事件和绘制分割线-高级UI
- [转]如何处理UI对象和场景对象点击事件冲突/重复
- iOS开发-UI控件:自定义UITableViewCell 上的多个按钮点击事件处理