UGUI的事件点击原理
本质上来说,点击事件就是发送一条射线,完全可以自己实现(在鼠标点击处发射射线,判断碰到的物体的标签,是则触发事件),UGUI就是起了封装的作用
事件系统的原理:
-
创建UI元素时会自动创建
EventSystem
对象,该对象包含EventSystem
和StandaloneInputModule
两个组件/脚本EventSystem
组件负责处理输入、射线以及发送事件,将所有的InputModule放在一个内部列表中,并在每个Update周期中更新它们StandaloneInputModule
(系统提供的标准输入模块),还有TouchInputModule
(触摸输入模块),都是继承自BaseInputModule
,负责发送输入事件(点击、拖拽、选中等)到具体对象
-
Canvas上绑定
GraphicRaycaster
组件后才能响应事件,EventSystem
会获取所有绑定了GraphicRaycaster
的对象,之后才能对其发起射线检测,所以Canvas越多,效率越低 -
响应事件,找到最上层的UI元素,抛出正确的事情响应。
补充:
(直接界面上拖拽,脚本绑定,EventTrigger)
操控UI事件的几种方式
1. 整个画布都不接受事件
将组件Graphic Raycaster移除
不会阻挡射线,射线会继续向下
2. 控制单个UI元素不接受事件
可交互组件内的Interactable取消勾选,注意要设置被禁用时的样式,否则默认样式很丑
会阻挡射线,无法继续向下
3. 自由控制画布或元素是否接受鼠标事件
在画布或者UI元素上挂载Canvas Group组件,并将其Block Raycasts属性设置为false
当然了,Canvas Group组件下也可以设置是否可交互Interactable,效果同上
不会阻挡射线,射线会继续向下
UI界面的层级控制
0. 相机深度
Camera组件下的Depth属性,越大的相机将内容覆盖在小的相机上(当然了,前提是有多个相机同时成像)
1. Sorting Layer
画布在摄像机渲染模式下的属性,层级越下,显示越上(针对画布)
2. Order in Layer
在上述层级相同时,画布的深度由该属性决定,数字越大,显示越上(针对画布)
3. 层级窗口的顺序
画布中的UI元素按从上往下的顺序渲染,则下面的元素是遮盖上面的元素的(针对画布内的元素)
4. 代码设置
通过代码调整元素在层级窗口中的顺序
1. 设置为最先渲染的,会被挡住
transform.SetAsFirstSibling();
2. 设置为最后渲染的,不被挡住
transform.SetAsLastSibling();
3.设置具体的层级,n为从上往下的层级
transform.SetSiblingIndex(n)
EventSystem中的源码
先判断摄像机的深度(前提有多个摄像机),再比较SortingLayer(前提有SortingLayer),sortOrder,深度,距离,index
Renderer显示层级