NGUI执行基本事件的原理
通常我们为对象附加一个脚本组件,脚本组件只要加此鼠标处理事件方法,这个对象就有了点击事件了:
void OnClick() {
Debug.Log("onclick");
}
这些都是大家很常用的事件,所以就不一一解释了!有哪些事件我们可以调用,这个问题解决了,接下来看,附加到对象上的脚本中的事件(以上所列出的事件)是如何被执行的?接下来我们就来看下UICamera是如何对这些事件进行处理的!
在UICamera里面最先执行的就是Awake方法,所以我们先从Awake方法看起:
可以看出Awake方法主要的功能就是判断设备类型,从而确定你是使用的是鼠标还是触摸方式,但我们通常都是用电脑去设计游戏,所以以上的判断都没有被执行,而useMouse和useTouch字段默认都为true,所以这两个字段的值不变,接下来看Update方法(Start方法没什么好说的),当执行到update中的一段代码时,如下:
// Process touch events first
if (useTouch) ProcessTouches();
else if (useMouse) ProcessMouse();
因为useTouch为true,所以程序回去执行 ProcessTouches方法,这个方法主要是对触屏事件方法的响应,转到ProcessTouches方法,运行到这句话:for (int i = 0; i < Input.touchCount; ++i),这句话Input.touchCount为0,因为我们操作电脑只能通过鼠标,根本不存在触屏操作,所以Input.touchCount为0,程序继续执行下面的
if (Input.touchCount == )
{
if (useMouse) ProcessMouse();
#if UNITY_EDITOR
else ProcessFakeTouches();
#endif
}
如果没有触屏事件,那么就会去执行鼠标事件,也就是去执行ProcessMouse方法去,转到ProcessMouse方法,里面有这么一段代码:
bool isPressed = false;
bool justPressed = false; for (int i = ; i < ; ++i)
{
if (Input.GetMouseButtonDown(i))
{
currentScheme = ControlScheme.Mouse;
justPressed = true;
isPressed = true;
}
else if (Input.GetMouseButton(i))
{
currentScheme = ControlScheme.Mouse;
isPressed = true;
}
} // No need to perform raycasts every frame
if (isPressed || posChanged || mNextRaycast < RealTime.time)
{
mNextRaycast = RealTime.time + 0.02f;
if (!Raycast(Input.mousePosition)) hoveredObject = fallThrough;
if (hoveredObject == null) hoveredObject = genericEventHandler;
for (int i = ; i < ; ++i) mMouse[i].current = hoveredObject;
}
当我们点击按钮时,isPressed就会为true,而mNextRaycast 永远<RealTime.time,所以内部的代码一直会被执行,也就是说一直执行里面的Raycast方法(即我们所知的发射线),转到Raycast方法去,在Raycast方法里面,他会判断你当前选择的EventType,有两种选择:World 表示按被击中点的距离排序执行一个物理射线,UI表示按部件深度排序执行一个物理射线,通常我们选择的是UI,因为对象的层次我们通常是按depth来设计的,在 i f (cam.eventType == EventType.UI) 里面他会执行Physics.RaycastAll ,也就是发出射线,并把击中的对象赋给hoveredObject(hoveredObject = hit.collider.gameObject),RayCast的作用差不多就是找到被击中的对象,赋给hoveredObject,回过头来,因为hoveredObject对象保存的是被击中的对象,在ProcessMouse方法里for (int i = 0; i < 3; ++i) mMouse[i].current = hoveredObject;把此对象付给了mMouse[i],for循环之所以为3次,因为鼠标有三个键,左键,滚轮键,右键,代码继续执行
// Process all 3 mouse buttons as individual touches
for (int i = ; i < ; ++i)
{
bool pressed = Input.GetMouseButtonDown(i);
bool unpressed = Input.GetMouseButtonUp(i); if (pressed || unpressed) currentScheme = ControlScheme.Mouse; currentTouch = mMouse[i];
currentTouchID = - - i;
currentKey = KeyCode.Mouse0 + i;
if (pressed || unpressed)
// We don't want to update the last camera while there is a touch happening
if (pressed) currentTouch.pressedCam = currentCamera;
else if (currentTouch.pressed != null) currentCamera = currentTouch.pressedCam; // Process the mouse events
ProcessTouch(pressed, unpressed);
currentKey = KeyCode.None;
}
这里可以看到,射线击中的对象被赋给了currentTouch对象了,当鼠标按下时,pressed表示是否按下,unpressed表示鼠标是否抬起,当我们点击按钮知道完成,pressed和unpressed值会经历这样的变化:True,false -> false true,程序执行到ProcessTouch方法,因为我们是点击事件,所以此方法内部的Notify(currentTouch.pressed, "OnClick", null)这段代码会被执行,继续执行Notify方法:
static public void Notify(GameObject go, string funcName, object obj)
{
if (mNotifying) return;
mNotifying = true; if (NGUITools.GetActive(go))
{ go.SendMessage(funcName, obj, SendMessageOptions.DontRequireReceiver); if (genericEventHandler != null && genericEventHandler != go)
{
genericEventHandler.SendMessage(funcName, obj, SendMessageOptions.DontRequireReceiver);
}
}
mNotifying = false;
}
内部是调用对象的SendMessage方法的,对SendMessage方法不懂得,可以参照这篇文章:
http://www.cnblogs.com/MrZivChu/p/sendmessage.html
就此就完成了整个onclick方法的执行了,因为Update方法是一直执行的,所以UICamera脚本会一直发出射线来检测鼠标或者触屏事件,从而执行相应的方法,原理大概就是这样!
以上是个人的总结,如有不当,希望大家多多批评指正!
NGUI执行基本事件的原理的更多相关文章
- 四、Struts2的执行过程和原理
执行过程和原理(可能面试题) 学习目标:熟知struts2的执行过程(下图记住).源码可以不看 a.过滤器的初始化 .StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有 ...
- Session执行机制与原理
Session执行机制与原理 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 什么是Session 首先了解一下Session的中文意思:一次会话,什么是一次会话呢?我举个例子:就我们现 ...
- javascript中的立即执行函数的原理
形如 ((function Test(a) { //code here... })('Hello')); 被称作立即执行函数. 首先需要了解的是,这并不是一种hack,这是javascript的基本语 ...
- SELECT TOP 1 比不加TOP 1 慢的原因分析以及SELECT TOP 1语句执行计划预估原理
本文出处:http://www.cnblogs.com/wy123/p/6082338.html 现实中遇到过到这么一种情况: 在某些特殊场景下:进行查询的时候,加了TOP 1比不加TOP 1要慢(而 ...
- Struts 2 Spring Hibernate三大框架的执行流程以及原理
Struts2框架 一.简介 Struts2是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架.它基于当年的WebWork和XWork框架,继承其优点,同时 ...
- springMVC执行流程及原理
spring的MVC执行原理 1.spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求 进行真正的处理工作. 2.DispatcherSer ...
- C C++ Java C# JS编译、执行过程的原理入门分析
C.C++是典型的编译型编程语言,编译链接后,点击则可执行. JS,解释型脚本语言,则不需要进行编译,直接解释执行. Java和C#则是所谓的高级语言,编译执行的方式做了很多处理, 尤其是C#,VS编 ...
- Flask源码解析:Flask应用执行流程及原理
WSGI WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述服务器端如何与web应用程序通信的 ...
- Struts框架的执行流程或原理
Struts2的执行流程如下: 1.浏览器发送请求,经过一系列的过滤器,到达StrutsPreapareAndExecteFilter 2.StrutsPrepareAndExectueFilter通 ...
随机推荐
- 2017.10.25 Java List /ArrayList 三种遍历方法
java list三种遍历方法性能比较 学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入记录,然后遍历ArrayList,测试代码如下: pac ...
- 通过eclipse启动tomcat设置JAVA_OPTS失败的解决方案
clipse中配置tomcat方法: Window-->Preference-->Server-->Runtime Environment-->add-->Apache ...
- Aspects– iOS的AOP面向切面编程的库
简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原 ...
- 干货!一篇文章集合所有Linux基础命令,适合所有菜鸟学习和老手回顾!
1 文件{ ls -rtl # 按时间倒叙列出所有目录和文件 ll -rt touch file # 创建空白文件 rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制) dos2u ...
- 《Python语言及其应用》学习笔记
第二章 ========== 对象的类型决定了可以对它进行的操作.对象的类型还决定了它装着的数据是允许被修改的变量(可变的),还是不可被修改的常量(不可变的). Python是强类型的,你永远无法修改 ...
- Python9-数据类型-day3
数据类型转换 #int----->str s = 1 i = str(s) print(i) #str----->int s = ' i = int(s) print(i) #int--- ...
- linux socketpair
相对于无名管道来说,socketpair也是使用在亲缘进程之间,不过它提供了能够全双工通信的通道 man socketpair: #include <sys/types.h> /* See ...
- linux无名管道
特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...
- Codeforces Round #481 (Div. 3) 全题解
A题,题目链接:http://codeforces.com/contest/978/problem/A 解题心得:题意就是让你将这个数列去重,重复的数只保留最右边的那个,最后按顺序打印数列.set+m ...
- POJ:2739-Sum of Consecutive Prime Numbers(尺取)
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27853 Ac ...