http://blog.csdn.net/onerain88/article/details/18963539

. UICamera 功能介绍

主要包括UI事件的监听,分发,覆盖范围为此Camera渲染的所有GameObject。

事件源包括:鼠标,触摸,键盘,手柄。

事件包括:悬停,按下/抬起,选中/取消选中,点击,双击,拖拽,释放,文本输入,Tips显示,滚轮滑动,键盘输入。

2. UICamera 实现流程

(1)属性

Event Type:包括UI,World,用于区分UICamera处理UI事件的对象是UI控件还是3D物体。

EventMask:可以过滤掉一些不需要接受UI事件的对象

Event Sources:是指需要处理的事件源,比如iPhone可能只需要Touch,PC平台可能还需要Mouse,Keyboard勾选

Thresholds:是指事件误差的范围,比如Mouse Click是指鼠标的按下和抬起两个事件在UI上的偏移误差不能大于10pixels,当大于10pixels时,则认为不是点击事件!

Axes and Keys:是指方向键/摇杆,键盘绑定

(吐槽一下,对于Horizontal这种字符串的设置,如果不小心修改了,就没办法根据字符串找到对应的变量值了,建议改成枚举类型)

(2)监听和分发

在Update()中,依次处理 触摸/点击,文本输入,键盘/摇杆输入,Tip。

其中最主要的就是 触摸/点击 事件的处理了,下面以触摸事件处理ProcessTouches()来分析。

NGUI封装了一个MouseOrTouch类封装Unity3D中Touch类,主要包括位置,偏移,碰撞到的GameObject,事件标志。

在UICamera中,缓存着以id为Key,以MouseOrTouch对象为Value的字典对象mTouches,在ProcessTouches()中,通过Unity3D提供的Input.GetTouch()获取到Touch对象,如果是新的触摸点,则缓存在mTouches中,获取当前触摸点(MouseOrTouch对象),对其属性进行计算和设置。

对于每个触摸对象,都需要通过ProcessTouch(bool pressed, bool unpressed)处理,在这个方法中,主要用于对不同事件的区分和分发。

pressed和unpressed表示当前触摸对象的当前状态,这里拿常用的点击事件举例,根据对点击事件的理解,我们应该知道此时触摸对象的当前状态分别为pressed=false,unpressed=true,并且此MouseOrTouch对象的touchBegan=false,pressed!=null。

我们先看pressed=false的处理,这里需要主要的是对当前MouseOrTouch“从开始到现在”偏移量,当这个偏移量大于设置的Mouse Click/Touch Tap时,则取消此次Click事件。

再看unpressed=true的处理,首先应该确定此MouseOrTouch对象的pressed对象不为null,然后判断当前MouseOrTouch对象的拖拽对象是否等于当前对象,并且当前MouseOrTouch对象的click事件没有在上一步取消掉,并且MouseOrTouch对象的整体偏移量小于设置的Drag值(Thresholds中设置的Mouse Drag/Touch Drag),在这些条件下,则满足“点击事件”,发送给MouseOrTouch对象的pressed对象OnClick消息,此MouseOrTouch对象处理完成!

(上述分析只是对于“点击事件”,如果要分析其它事件的具体逻辑,可以先根据事件类型确定ProcessTouch()方法的两个参数,然后根据参数在不同分支中分析代码)

3. 区分多种点击事件

NGUI中提供了一种对于点击事件的处理,假如我们希望添加自己的点击事件处理,并且区别于NGUI的触摸事件,举例来说,假设我们的场景中的地图和HUD的UI都是可以点击的,这里用一个UIButton和3D Cube模拟场景

对于一次点击事件,如果点击到UI控件上,我们将取消对于自定义事件的逻辑处理;如果没有点击到UI控件上,我们需要判断是否点击到“自定义区域”,假如点击到了,则执行自定义事件的逻辑处理。

这时我们可以通过UICamera的

static public bool Raycast (Vector3 inPos, out RaycastHit hit)

的返回值来确定这次点击事件是否触发了UI事件,如果触发了,则取消对自定义事件的逻辑处理。

(这个方法将场景中所有的UICamera依次遍历判断)

(PS:这样做虽然相当于做了两次UI碰撞检测,但是避免了判断自定义事件与UI事件调用Update()的顺序问题)

NGUI之UICamera控制触摸,鼠标事件的更多相关文章

  1. win10 支持默认把触摸提升鼠标事件 打开 Pointer 消息

    原文:win10 支持默认把触摸提升鼠标事件 打开 Pointer 消息 在 WPF 经常需要重写一套触摸事件,没有UWP的Pointer那么好用. 如果一直都觉得 WPF 的触摸做的不好,或想解决 ...

  2. NGUI的UICamera

    参考 https://blog.csdn.net/kakashi8841/article/details/20548429   全文请查看:http://note.youdao.com/notesha ...

  3. 【Unity3D】【NGUI】UICamera

    原文:http://www.tasharen.com/forum/index.php?topic=6711.0 NGUI讨论群:333417608 概述 UICamera这个名字不是很合适,保留的原因 ...

  4. Unity3D笔记十六 输入输出-键盘事件、鼠标事件

    输入与控制操作Unity为开发者提供了Input类库,其中包括键盘事件.鼠标事件和触摸事件等一切跨平台所需要的控制事件. 一.键盘事件 1.按下事件 Input.GetKeyDown():如果按键被按 ...

  5. OpenCV3添加滑动条和鼠标事件到图形界面

    鼠标事件和滑动条控制在计算机视觉和OpenCV中非常有用,使用这些控件,用户可以直接与图形界面交互,改变输入图像或者变量的属性值. /* In this section, we are going t ...

  6. day53 鼠标事件 键盘事件 及JQuery

    复习 // 语法: ECMAScript 操作: DOM BOM // 1.类型转化 // 转数字: +"3.14" | parseInt("123abc") ...

  7. Java知多少(93)鼠标事件

    鼠标事件的事件源往往与容器相关,当鼠标进入容器.离开容器,或者在容器中单击鼠标.拖动鼠标时都会发生鼠标事件.java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionL ...

  8. PyQt5编程:鼠标事件

    参考链接:https://www.cnblogs.com/zhuluqing/p/9028816.html 一.每个事件都被封装成相应的类: pyqt中,每个事件类型都被封装成相应的事件类,如鼠标事件 ...

  9. quick-cocos2d-x游戏开发【10】——触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT

    假设看过sample中touch的代码,你会发现演示样例中有一个cc.NODE_TOUCH_CAPTURE_EVENT事件.它和cc.NODE_TOUCH_EVENT触摸事件一样,是引擎级别的事件,我 ...

随机推荐

  1. IT男的”幸福”生活"续4

    翻来翻去,总是睡不觉.大脑口一堆问题.一个又冒出一个,没完没了.明天该怎样去进行下一步呢.. ….. 夜一下子深黑很多,窗外的公路,时而有货车通过,动不动按喇叭,而我住在二楼,真它的吵.也许她住在五楼 ...

  2. beta汇总

    第一天:http://www.cnblogs.com/hxh969012806/p/5034085.html 第二天:http://www.cnblogs.com/zyk150910/p/503783 ...

  3. Oracle 索引

    索引是建立在数据库表中的某些列的上面,是与表关联的,可提供快速访问数据方式,但会影响增删改的效率:常用类型(按逻辑分类):单列索引和组合索引.唯一索引和非唯一索引. 什么时候要创建索引 (1)在经常需 ...

  4. 在Oracle里,表的别名不能用as,列的别名可以用as

    列的别名也可以不用as,如:select t.a xxx from table t 在Oracle数据库中,数据表别名是不能加as的,例如: select a.appname from appinfo ...

  5. JAVA成员变量为什么不能在类体中先定义后赋值

    package dx; public class Test1 { int a111;//定义成员变量(全局变量) // a = 1;//此处若给变量赋值,会报错,JAVA所有的除定义或声明语句之外的任 ...

  6. OC基础--block

    block与函数类似:1.可以保存代码 2.又返回值 3.有形参 4.调用方式一样 block的标志:^ 一.定义一个无参无返回值的block void (^myBlock)();--1.void 代 ...

  7. Svn-如何清除eclipse中保存的svn用户名和密码

    1. 查看你的Eclipse中使用的是什么SVN Interface windows > prefeSence > Team > SVN #SVN Interface 2. 如果是用 ...

  8. Hibernate-二级缓存 sessionFactory

    Hibernate 二级缓存 二级缓存需要sessionFactory来管理,它是进初级的缓存,所有人都可以使用,它是共享的. 当Hibernate根据ID访问数据对象的时候,首先从Session一级 ...

  9. structs环境搭建

    (1)<s:fielderror />放在JSP中,如果没在web.xml中配置filter相关内容,会有The Struts dispatcher cannot be found.从而显 ...

  10. MVC传值汇总

     方法一: Url传参是通过Get的方式,一般我们都是通过一定规则的Url来传参.比如下面的URL. http://localhost/contorller/action/?Params1=a& ...