我是靠谱客的博主 糊涂发箍,最近开发中收集的这篇文章主要介绍Unity3D开发(七):NGUI之UICamera控制触摸,鼠标事件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

先给论坛做个广告:点击打开链接


1.UICamera功能介绍

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

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

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

2.UICamera实现流程

(1)属性

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

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

EventSources:是指需要处理的事件源,比如iPhone可能只需要TouchPC平台可能还需要MouseKeyboard勾选

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

AxesandKeys:是指方向键/摇杆,键盘绑定

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

(2)监听和分发

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

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

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

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

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

pressedunpressed表示当前触摸对象的当前状态,这里拿常用的点击事件举例,根据对点击事件的理解,我们应该知道此时触摸对象的当前状态分别为pressed=falseunpressed=true,并且此MouseOrTouch对象的touchBegan=falsepressed!=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的触摸事件,举例来说,假设我们的场景中的地图和HUDUI都是可以点击的,这里用一个UIButton3DCube模拟场景

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

这时我们可以通过UICamera

staticpublicboolRaycast(Vector3inPos,outRaycastHithit)

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

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

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

最后

以上就是糊涂发箍为你收集整理的Unity3D开发(七):NGUI之UICamera控制触摸,鼠标事件的全部内容,希望文章能够帮你解决Unity3D开发(七):NGUI之UICamera控制触摸,鼠标事件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部