提交 2627d45b 编写于 作者: kerven_hankangwen's avatar kerven_hankangwen

更新README.md

上级 6301ad7e
......@@ -15,11 +15,17 @@ GetComponent<Button>().onClick.AddListener(() => {
### 查看源码前的配置
为了能够方便的查阅源码以及进行代码调试,需要重新导入UGUI包。新建Unity项目,找到Project/Packages/Unity UI,右键 Show in Explorer,将其复制到任意一个新的文件夹中(记住保存的位置,待会需要引用)。
接下来打开Window/Package Manager
![](https://img-blog.csdnimg.cn/img_convert/a1727f7851ec477841c983450684bd05.png)
找到Unity UI,将其Remove
![](https://img-blog.csdnimg.cn/img_convert/4cb124629d9e0e0afa9ddb1891694c36.png)
然后点击“+”号,选择Add package form disk...,找到之前保存的UI包,进入目录后选中package.json,点击打开。
![](https://img-blog.csdnimg.cn/img_convert/37e4d85eb79c7dd02fe862b1a940a4b7.png)
大功告成,现在我们可以查看/修改UGUI的源码了。
### 探究UGUI源码
#### Button的调用链
......@@ -83,7 +89,9 @@ private static void Execute(IPointerClickHandler handler, BaseEventData eventDat
}
```
为了能看的更清楚,总结一下调用关系,即Button继承自Selectable、IPointercliClickHandler、ISubmitHandler,而IPointercliClickHandler、ISubmitHandler继承自IEventSystemHandler,ExecuteEvent会在鼠标松开时通过Execute函数调用IPointercliClickHandler、ISubmitHandler接口的方法,从而触发Button的onClick事件,如下图所示
![](https://img-blog.csdnimg.cn/img_convert/519d0c4871d11a9690997d38ba4d3818.png)
继续往上找,ExecuteEvents类中还定义了一个EventFunction<T1>的泛型委托以及该委托类型的属性,这个返回s_PointerClickHandler,要查找谁触发的点击事件,只需要找到谁调用了pointerClickHandler即可
```csharp
......@@ -168,17 +176,23 @@ public static bool Execute<T>(GameObject target, BaseEventData eventData, EventF
}
```
也就是说,EventSystem会在Update()中调用当前可用BaseInputModule的Process()方法,该方法会处理鼠标的按下、抬起等事件,当鼠标抬起时调用ReleaseMouse()方法,并最终调用Execute()方法并触发IPointerClick事件。 如下图所示(为了简洁,类图并不完整)
![](https://img-blog.csdnimg.cn/img_convert/4cba69e91cd41220f9ba44acd3942274.png)
> ReleaseMouse()是否只有鼠标左键抬起才会触发?
鼠标左、中、右键都会触发该函数,只不过Button在实现OnPointerClick()函数时忽略了鼠标中键和右键,使得只有左键能触发Button的点击事件
但现在还存在一个问题,怎么知道上述代码中事件执行目标target的值呢?探究这个问题之前,我们需要先对UGUI源码有个总体的认识,因为它涉及的知识点比较多。
### 事件系统整体概述
我们先看EventSystem源码在文件夹中的分类
![](https://img-blog.csdnimg.cn/img_convert/bb565f4a45080c6aa1682694ae0c3b3b.png)
从图中就可以看出主要包含三个子板块,分别是EvnetData、InputModules和Raycasters。
再看一个整体的类图,类图中包括了许多重要的类,如EventSystem、BaseRaycast、BaseInputModule等,它们都是继承自UIBehaviour,而UIBehaviour又是继承MonoBehaviour。(类图并不完整,只涉及部分类)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2e153c483c0f44569317b0e15e004560.png)
接下来对这些内容进行详细讲解。
EventSystem类
......@@ -1273,4 +1287,4 @@ Shadow效果 改变效果的距离(effectDistance)及颜色(effectColor)、变
Mask控件 设置是否展示与Mask渲染区域相关的图形(showMaskGraphic),enable发生变化
所有继承MaskableGraphic的控件(Image、RawImage、RectMask2D、Text) 设置此图形是否允许被遮盖、enable发生变化、父节点发生变化(TransFromParentChanged)、在Hierachy面板上发生改变(HierachyChanged)。
所有继承自BaseMeshEffect的效果类(目前只看到Shadow及PositionAsUV1)的enable变化及应用动画属性的操作。
所有继承自Graphic的UI控件材质(material)发生变化。
\ No newline at end of file
所有继承自Graphic的UI控件材质(material)发生变化。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册