1.UICamera功能介绍
主要包括UI事件的监听,分发,覆盖范围为此Camera渲染的所有GameObject。
事件源包括:鼠标,触摸,键盘,手柄。
事件包括:悬停,按下/抬起,选中/取消选中,点击,双击,拖拽,释放,文本输入,Tips显示,滚轮滑动,键盘输入。
2.UICamera实现流程
(1)属性
EventType:包括UI,World,用于区分UICamera处理UI事件的对象是UI控件还是3D物体。
EventMask:可以过滤掉一些不需要接受UI事件的对象
EventSources:是指需要处理的事件源,比如iPhone可能只需要Touch,PC平台可能还需要Mouse,Keyboard勾选
Thresholds:是指事件误差的范围,比如MouseClick是指鼠标的按下和抬起两个事件在UI上的偏移误差不能大于10pixels,当大于10pixels时,则认为不是点击事件!
AxesandKeys:是指方向键/摇杆,键盘绑定
(吐槽一下,对于Horizontal这种字符串的设置,如果不小心修改了,就没办法根据字符串找到对应的变量值了,建议改成枚举类型)
(2)监听和分发
在Update()中,依次处理触摸/点击,文本输入,键盘/摇杆输入,Tip。
其中最主要的就是触摸/点击事件的处理了,下面以触摸事件处理ProcessTouches()来分析。
NGUI封装了一个MouseOrTouch类封装Unity3D中Touch类,主要包括位置,偏移,碰撞到的GameObject,事件标志。
在UICamera中,缓存着以id为Key,以MouseOrTouch对象为Value的字典对象mTouches,在ProcessTouches()中,通过Unity3D提供的Input.GetTouch()获取到Touch对象,如果是新的触摸点,则缓存在mTouches中,获取当前触摸点(MouseOrTouch对象),对其属性进行计算和设置。
对于每个触摸对象,都需要通过ProcessTouch(boolpressed,boolunpressed)处理,在这个方法中,主要用于对不同事件的区分和分发。
pressed和unpressed表示当前触摸对象的当前状态,这里拿常用的点击事件举例,根据对点击事件的理解,我们应该知道此时触摸对象的当前状态分别为pressed=false,unpressed=true,并且此MouseOrTouch对象的touchBegan=false,pressed!=null。
我们先看pressed=false的处理,这里需要主要的是对当前MouseOrTouch“从开始到现在”偏移量,当这个偏移量大于设置的MouseClick/TouchTap时,则取消此次Click事件。
再看unpressed=true的处理,首先应该确定此MouseOrTouch对象的pressed对象不为null,然后判断当前MouseOrTouch对象的拖拽对象是否等于当前对象,并且当前MouseOrTouch对象的click事件没有在上一步取消掉,并且MouseOrTouch对象的整体偏移量小于设置的Drag值(Thresholds中设置的MouseDrag/TouchDrag),在这些条件下,则满足“点击事件”,发送给MouseOrTouch对象的pressed对象OnClick消息,此MouseOrTouch对象处理完成!
(上述分析只是对于“点击事件”,如果要分析其它事件的具体逻辑,可以先根据事件类型确定ProcessTouch()方法的两个参数,然后根据参数在不同分支中分析代码)
3.区分多种点击事件
NGUI中提供了一种对于点击事件的处理,假如我们希望添加自己的点击事件处理,并且区别于NGUI的触摸事件,举例来说,假设我们的场景中的地图和HUD的UI都是可以点击的,这里用一个UIButton和3DCube模拟场景
对于一次点击事件,如果点击到UI控件上,我们将取消对于自定义事件的逻辑处理;如果没有点击到UI控件上,我们需要判断是否点击到“自定义区域”,假如点击到了,则执行自定义事件的逻辑处理。
这时我们可以通过UICamera的
staticpublicboolRaycast(Vector3inPos,outRaycastHithit)
的返回值来确定这次点击事件是否触发了UI事件,如果触发了,则取消对自定义事件的逻辑处理。
(这个方法将场景中所有的UICamera依次遍历判断)
(PS:这样做虽然相当于做了两次UI碰撞检测,但是避免了判断自定义事件与UI事件调用Update()的顺序问题)
分享到:
相关推荐
Unity开发的朋友,做UI的时候,选择NGUI比GUI更好用。最新版本的unity3d扩展插件:NGUI+Next-Gen+UI3.0.2.unitypackage 解压后运行Unity3D,在菜单Assets中选择自定义导入。 如果无法导入时,请检查导入目录中是否...
Unity3D教程:利用NGUI制作超链接 Posted on 2013年02月22日 by U3d / Unity3D 基础教程/被围观 469 次 Unit
NGUI Next-Gen UI 3.6.0.unitypackage NGUI Next-Gen UI 3.12.1(u5.6.5).unitypackage NGUI Next-Gen UI 2019.3.0.unitypackage NGUI Next-Gen UI v2018.3.0.unitypackage NGUI Next-Gen UI v2018.3.0c(u2018.3.0)....
Unity3D NGUI Next-Gen UI 2.2.2
不过不得不说的是,NGUI有个好处是消耗的DrawCalls比较少,基本就一个,所以如果做手机应用的话,NGUI肯定是比较不错的。之所看NGUI,因为自己本身也
Unity3D插件NGUI中运用Atlas Front和 制作Atlas和Font的步骤 并在unity3d使用
最新版NGUI3.10.2是严格遵循KISS原则并用C#编写的Unity(适用于专业版和免费版)插件,提供强大的UI系统和事件通知框架。其代码简洁,多数类少于200行代码。这意味着程序员可以很容易地扩展NGUI的功能或调节已有功能...
unity3d 最火UI插件,NGUI,unity3d 最火UI插件,NGUI,unity3d 最火UI插件,NGUI,unity3d 最火UI插件,NGUI,unity3d 最火UI插件,NGUI
一部分的目录东西太多了 行为控制脚本 鼠标的路线 Unity3D教程:游戏玩家服务器的制作 Unity3D教程:实例化 JS脚本控制逐渐淡出的欢迎界面 Unity3D教程:界面插件NGUI的使用 (2) 脚本控制物体的变换 脚本的运行顺序...
NGUI Next-Gen UI是一款功能强大、灵活性高的UI插件,是当前最新版本的NGUI插件。它可以覆盖Unity的多个版本,包括Unity 5、Unity 2017和Unity 2018等。与其他UI插件相比,NGUI Next-Gen UI具有高效的性能和优秀的...
Unity3d之NGUI简单计算器入门,可以作为简单的入门学习,具体步骤参照我博客http://blog.csdn.net/wyz365889/article/details/9326473
unity3D GUI插件(NGUI+iGUI+EZGUI)
适用于unity3d2018的 NGUI插件 在Unity 项目中,Project视图下ASSETS文件夹上,右键 【Import Package】-->【Custom Package】,选择刚刚下好的 NGUI3.12.1插件包。然后,全部导入。
- NEW: Added UICamera.first referencing the active NGUI event system. - FIX: Alpha should now work as expected with Linear lighting. - FIX: UICamera.isOverUI should now work properly for all types of ...
Unity 3D NGUI实战教程.pdf(大小84.4M),有出现10几M pdf 那才36页,原书有233页
Unity3D 插件NGUI Next Gen UI 3.9.9and3.6.8 两个版本了
Unity编辑器:基于NGUI的引用检测工具
unity3d 开发必备神器, NGUI最新版本3.5.9 不需要点击Play按钮就能查看结果。 在场景视图中看到的就是在游戏视图中得到的(所见即所得)。 基于组件的、模块化的特性:要让你的界面控件做什么,只需为其...
Unity3D_NGUI实战教程
NGUI是严格遵循KISS原则并用C#编写的Unity(适用于专业版和免费版)插件,提供强大的UI系统和事件通知框架。其代码简洁,多数类少于200行代码。这意味着程序员可以很容易地扩展NGUI的功能或调节已有功能。对所有其他...