unity ugui 整体设计分析

来源:互联网 发布:中日未来关系 知乎 编辑:程序博客网 时间:2024/05/16 07:23

一、整体描述

1、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等,都是现实了它的接口。

总结

1、三者是靠RaycasterManager联系起来,射线会在OnEnable中添加自己到RaycasterManager的s_Raycasters列表中,OnDisable会移出。输入事件在Process中循环获取RaycasterManager中s_Raycasters,遍历并执行调用Raycast。到此就是上面的说的得到IEventSystemHandler对象并分发事件了。

最后:加我群一块进步吧 115136489  点击支持下吧
0 0