Unity3D研究院之将UI的点击事件渗透下去(转)
转自 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是不会被响应的。

假如想把点击的事件透下去,让所有的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就行。             }         }     } } | 
这样UI下面那些对应接收点击事件的地方都可以响应到了。。如下图所示,我点击在前面的UI后面的消息也能响应到了。
Unity3D研究院之将UI的点击事件渗透下去(转)的更多相关文章
- Unity3D研究院编辑器之Editor的GUI的事件拦截
		OnGUI是Unity上一个时代的UI系统,而现在运行时的UI系统已经被UGUI取代,但是Editor的UI还是在用老的这一套GUI系统.比如unity编辑器里的所有窗口,布局,按钮,拖动条.滚动等等 ... 
- #你好Unity3D#Hierarchy视图监听gameObject点击事件
		今天无意间又找到了个好方法 1 2 3 4 5 6 7 8 9 10 [InitializeOnLoadMethod] static void Start () { Selection.s ... 
- Unity3D研究院之与Android相互传递消息
		原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ... 
- (转)Unity3D研究院之Assetbundle的实战(六十三)
		上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院之Assetbundle的原理(六十一) 本篇文章我们将说说assetbundl ... 
- Unity3D研究院之Assetbundle的实战(六十三)
		http://www.xuanyusong.com/archives/2405 上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院 ... 
- Unity3D研究院之Jenkins的使用(七十八)
		长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内 ... 
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条
		Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ... 
- [Unity3D] 03 - Component of UI
		还需进一步整理! ing... 博客参考 Unity 相关博客:Unity游戏开发爱好者 Unity 3D 连接Mysql数据库 Unity uGUI 登录界面 Unity uGUI 登录及注册功能 ... 
- (转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景
		自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平 ... 
随机推荐
- ssh方式与服务器建立连接
			package com.ustcinfo.cinas.pmng.util; import java.io.BufferedReader; import java.io.InputStream; imp ... 
- GridView如何将分页数据全部导出为EXCEL?
			GRIDVIEW分页状态下将全部数据导出 protected void Button2_Click(object sender, EventArgs e)//按button2将gridview将数据导 ... 
- JS检查当图片不存在时显示默认图片和键盘大小写键状态
			当图片不存在时显示默认图片 <script type="text/javascript"> var imgs = document.images; for(var i ... 
- python-类的方法与类的成员
			preface include: @classmethod @staticmethod @property 私有属性 类的成员 #!/usr/bin/env python class animal(o ... 
- [转] 关于QT的系统总结
			出处:http://www.cnblogs.com/wangqiguo/p/4625611.html 阅读目录 编译环境与开发流程 QT项目的构成及原理 QT中的布局 QT中的通用控件 QVarian ... 
- VMware12多台虚拟机上网设置
			1.根据镜像安装好linux系统, 2. 把网络适配器移除后,重新添加试试 3. 当按照上述配置后还是无法上网,把VMnet0 桥接模式的自动 ,这里重新点击下自动设置(其实没有做到自动配置) 4. ... 
- xcode 5.1打包iOS 7.1应用问题笔记
			XCODE 5.1默认情况下是要求应用都通过64位编译.但是往往有些第三方的类库还是32位.还木有更新64位类库.使得项目编译出错. 解决办法: BuildSetting 的Valid Archite ... 
- Java -- 新IO -- 目录
			20.1 Java 新IO简介 20.2 缓冲区与Buffer 例:演示缓冲区的操作流程 Class : IntBufferDemo01 20.2.2 深入缓冲区操作 20.2.3 创建子缓冲区 20 ... 
- logback 实例
			POM : <!-- log --> <dependency> <groupId>org.slf4j</groupId> <artifactId& ... 
- 5 -- Hibernate的基本用法 --4 3 JDBC连接属性
			Hibernate需要进行数据库访问,因此必须设置连接数据库的相关属性.所有Hibernate属性的名字和语义都在org.hibernate.cfg.Environment中定义. 关于JDBC连接配 ... 
