想学习一下ugui的优化,于是想看下ugui的源码,陆陆续续看了一周,进展也只有一点点。于是想记录一下遇到的问题,如果你不幸看到这个文章,避免和我一样的偏执吧。
1 我一直以为既然要点击,肯定要从点击入手,于是我找了半天输入源,结果筋疲力尽,依旧没有找到。因为UGUI里面根本不是从输入源开始进行的。
2 事件系统 将触摸和鼠标结合到了一起,所以看着有点乱。
3 我先从EventSystem开始看,然后看InputModule。如今看来应该先看下EventData。
4 先看下结构:
EventSystem:处理事件,比如点击,滑动拖拽等等。
EventData:每个事件的数据,这个数据包括:划入的go,按压的go,拖拽的go,最起初的接收事件的go,
还有点击的位置,点击的次数,是否在拖拽中等等。
InputModule:处理所有的输入事件。它里面有个字典,key是输入ID-1左键-2右键-3中键-4在不是触摸设备上的
触摸模拟,0,1,2,3,4,5 对应的多点触摸的手指。value是EventData。这里面重要的有几个函数:
Process() 处理输入
ProcessTouchEvents() 处理触摸事件
GetTouchPointerEventData() 获取触摸事件的数据 *****很重要
ProcessMouseEvent();处理鼠标点击事件,与上边不是互斥的,而是并存的。
GetMousePointerEventData(id);获取点击事件的数据 ******很重要
Raycasters:射线,点击后,由摄像机到点击的点发送射线,找到点击的go们。这个类我直接无视了。
EventSystem:这个类在不停的update,不停的检测是否有事件触发,连接了InputModule和Raycasters。
ExecuteEvent:事件的处理函数,当鼠标划入了,go要处理划入事件,不幸点击了一下,要处理点击事件,还
有选中事件,取消选中事件,拖拽事件,取消拖拽,等等。根据事件在处理的进程中,会抛出不
同的事件
5 介绍一下点击流程:
首先,EventSystem在Update中不停的遍历自身BaseInputModule的component,一直在遍历,不停的检查是否有component激活了,激活的条件有两个IsModuleSupported() 和 ShouldActivateModule()。前者检查:是否强制激活模块,是否有鼠标,是否有触摸。后者检查:是否强制激活,enter输入,esc输入,横向输入,纵向输入,鼠标左键有按下,触摸的个数大于0。所以根本不存在从Input开始查看流程的事!
然后,发现有BaseInputModule模块激活了,则调用输入模块的Process()函数,开始处理。Process函数中先处理触摸事件,调用的是ProcessTouchEvents(),处理时需要获取触摸的数据,于是又调用了GetTouchPointerEventData(),在这个函数中,通过射线找了触摸的对象,至此已经获取了所有的数据,于是调用ProcessTouchPress()开始各种发事件,调用ExecuteEvent开始执行。Process函数接着处理鼠标事件,跟前边的类似。只是调用的函数是ProcessMouseEvent,GetMousePointerEventData,ProcessMouseEvent。
最后,没有了,ExeuteEvent开始执行就已经到了 事件的终结了。一个事件,从鼠标点击开始,被EventSystem检测到,进行处理,处理的时候需要收集各种数据,数据收集完毕后进行处理。完结撒花。
6 UI部分还没看,如果万一我有心看了,我会记录一下的,如果我偷懒没看,我会当一天和尚撞一天钟的,如果我看了,但是没记笔记,那估计是没有什么能震撼到我,或许心情不好,或对不知道的世界失去了信心。
7 有些东西多看两遍,总还是能稍微看懂一点的。看这之前,我带了太多的自己的想法,执拗固执偏执,于是费时费力。自己的想法是一定要带的,不然会被作者牵着走放弃了思考。但是带着的想法要从大方向上建立,比如你得站在空中,远望山脉的走向,然后低头看山中的道路,不时抬头看看走向,再低头看看路,不会迷失方向。我想我是想到了直线的发展方向,而忘了到终点的路是弯弯曲曲,还有可能会往回走,于是我愤懑了许久。教训啊。