Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
kerven_hankangwen
UnityUGUISourceCode
提交
2627d45b
U
UnityUGUISourceCode
项目概览
kerven_hankangwen
/
UnityUGUISourceCode
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
UnityUGUISourceCode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2627d45b
编写于
1月 18, 2022
作者:
kerven_hankangwen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新README.md
上级
6301ad7e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
15 addition
and
1 deletion
+15
-1
README.md
README.md
+15
-1
未找到文件。
README.md
浏览文件 @
2627d45b
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录