Unity ugui整体设计分析
发表于2018-10-12
下面和大家说说Unity ugui的整体设计分析。其中Unity ugui 整个架构中最主要是三个主要模块:InputModules输入模块、Raycasters射线模块、Event模块。
InputModules输入模块
1、输入模块中BaseInputModule是抽象基类,有一个Process抽象方法,如果自己去扩展的话,继承BaseInputModule去实现Process这个方法就好,目前UGUI系统中已经实现了触屏、鼠标、键盘输入等。当然目前VR比较火,自己完全可以自定义一个??去实现自己想要的输入。
2、我们在使用UGUI时场景中会有EventSystem物体上面绑定StandaloneInputModule这个类就是Unity已经实现的触摸、和键盘输入
3、输入模块将接收的数据后首先去获取自身EventSystem组件,调用RaycastAll方法此方法会通过静态公共类RaycasterManager得到所有BaseRaycaster(射线基类)通过它调用Raycast方法得到满足射线碰撞到的物体。此时输入组件模块和射线模块联系起来。通过排序然后得到第一个满足条件的对象。然后调用
ExecuteEvents.ExecuteHierarchy();方法将刚刚得到满足的对象进行检测如果当前没有IEventSystemHandler事件,就向上找父节点,直到直到然后调用ExecuteEvents.Execute()将当前的事件比如是点击、按下、抬起、滑动等,传递给包含IEventSystemHandler的对象处理。事件分发就是向上查找直到找到IEventSystemHandler
Raycasters射线模块
1、射线模块中BaseRaycaster是抽象基类,主要是从事件摄像机一般是场景的主摄像机发射射线,得到所有碰撞事件。
2、每个Canvas上都会GraphicRaycaster组件,这是Unity已经实现的射线模块。里面有些属性可以设置是否可以被射线检测到等(这里特殊说明下:这里的碰撞实际上不是真正的碰撞是计算当前坐标是否符合)
3、PhysicsRaycaster才是真正的摄像碰撞检测,它需要绑定Camera,一般适合包含在MainCamera上。适合UI中包含3D物体,进行一些事件检测。
Event模块
1、基类IEventSystemHandler,主要实接口IPointerEnterHandler,IPointerExitHandler,IBeginDragHandler等。一些常用的控件如Button等,都是现实了它的接口。
总结
以上就是Unity ugui整体设计分析,三者是靠RaycasterManager联系起来,射线会在OnEnable中添加自己到RaycasterManager的s_Raycasters列表中,OnDisable会移出。输入事件在Process中循环获取RaycasterManager中s_Raycasters,遍历并执行调用Raycast。到此就是上面的说的得到IEventSystemHandler对象并分发事件了。
来自:https://blog.csdn.net/st75033562/article/details/52460960