从bitbucket上获取uGUI 2019.1源码
UGUI内核大探究
UnityEngine.UI/EventSystem/EventSystem.cs
private List<BaseInputModule> m_SystemInputModules = new List<BaseInputModule>(); // 系统输入模块列表
private BaseInputModule m_CurrentInputModule; // 当前输入模块
UnityEngine.UI/EventSystem/EventInterfaces.cs
EventSystem可以通过ExecuteEvents类执行事件,那么事件是如何执行的呢?这里涉及到了两个文件EventInterface和ExecuteEvents。
EventInterface声明了一系列interface,例如IPointerEnterHandler(指针进入事件接口)。一个组件添加这个接口的继承之后,再实现OnPointerEnter方法,便可以接收到指针进入事件,也就是当鼠标滑入对象所在的区域之后,便会回调OnPointerEnter方法。
UnityEngine.UI/EventSystem/ExecuteEvents.cs
ExecuteEvents类是个静态类,不能被实例化,所有的公共方法都通过ExecuteEvents.XXXX来调用。EventInterface提供的接口都会在ExecuteEvents里被调用。
ExecuteEvents里声明了一个delegate的类型EventFunction,这是一个泛型委托,委托的第一个参数handler可以是不同的类型。然后对EventInterface里除了IEventSystemHandler外每一个接口声明了一个EventFunction类型的委托变量和方法。
private static readonly EventFunction<IPointerEnterHandler> s_PointerEnterHandler = Execute;
BaseInputModule是一个抽象类,是所有输入模块类的基类。PointerInputModule也是一个抽象类,继承自BaseInputModule,是StandaloneInputModule和TouchInputModule的基类。而StandaloneInputModule是在PC、Mac&Linux上的具体实现,而TouchInputModule是在IOS、Android等移动平台上的具体实现。之所以这种继承结构,我认为是向开发者提供了扩展,方便开发者实现新型设备的输入模块。
当鼠标或触摸进入、退出当前对象时执行pointerEnterHandler、pointerExitHandler。
在鼠标或者触摸按下、松开时执行pointerDownHandler、pointerUpHandler。
在鼠标或触摸松开并且与按下时是同一个响应物体时执行pointerClickHandler。
在鼠标或触摸位置发生偏移(偏移值大于一个很小的常量)时执行beginDragHandler。
在鼠标或者触摸按下且当前对象可以响应拖拽事件时执行initializePotentialDrag。
对象正在被拖拽且鼠标或触摸移动时执行dragHandler。
对象正在被拖拽且鼠标或触摸松开时执行endDragHandler。
鼠标或触摸松开且对象未响应pointerClickHandler情况下,如果对象正在被拖拽,执行dropHandler。
当鼠标滚动差值大于零执行scrollHandler。
当输入模块切换到StandaloneInputModule时执行updateSelectedHandler。(不需要Input类)
当鼠标移动导致被选中的对象改变时,执行selectHandler和deselectHandler。
导航事件可用情况下,按下上下左右键,执行moveHandler,按下确认键执行submitHandler,按下取消键执行cancelHandler。
UnityEngine.UI/UI/Core/CanvasUpdateRegistry.cs
UGUI组件都继承自UIBehaviour
UnityEngine.UI/UI/Core/Selectable.cs
Selectable是UGUI的核心组件,除了最常用的Button,它还是Scrollbar、Dropdown、Slider、Toggle、InputField这些组件的基类。
Button继承自Selectable并额外继承了IPointerClickHandler、ISubmitHandler两个接口。它还添加了一个UnityEvent类型的事件onClick。onClick事件可以添加用户自定义的监听,具体方法可以通过编辑器添加也可以通过onClick.AddListener添加。
Button就是相对于Selectable添加了响应点击和确认事件的接口,并且开放了可添加用户自定义监听的onClick事件。
而Selectable的作用在于提供了基于鼠标事件的四种状态变化。一方面,为Button、Dropdown等派生类提供了基础的逻辑,另一方面,我们也可以根据Selectable派生出新的自定义组件。
UnityEngine.UI/UI/Core/Button.cs 按钮
UnityEngine.UI/UI/Core/Toggle.cs 开关
UnityEngine.UI/UI/Core/Graphic.cs 图像
UnityEngine.UI/UI/Core/ScrollRect.cs 滚动区域
UnityEngine.UI/UI/Core/Scrollbar.cs 滚动条
UnityEngine.UI/UI/Core/Slider.cs 滑动条
UnityEngine.UI/UI/Core/Dropdown.cs 下拉框
UnityEngine.UI/UI/Core/.cs 文本
UnityEngine.UI/UI/Core/InputField.cs 输入框
UnityEngine.UI/UI/Core/VertexModifiers/Shadow.cs 阴影
UnityEngine.UI/UI/Core/VertexModifiers/Outline.cs 轮廓