Unity UGUI

1,018 阅读2分钟

UGUI的事件点击原理

本质上来说,点击事件就是发送一条射线,完全可以自己实现(在鼠标点击处发射射线,判断碰到的物体的标签,是则触发事件),UGUI就是起了封装的作用

事件系统的原理

  1. 创建UI元素时会自动创建EventSystem对象,该对象包含EventSystemStandaloneInputModule两个组件/脚本

    • EventSystem组件负责处理输入、射线以及发送事件,将所有的InputModule放在一个内部列表中,并在每个Update周期中更新它们
    • StandaloneInputModule(系统提供的标准输入模块),还有TouchInputModule(触摸输入模块),都是继承自BaseInputModule,负责发送输入事件(点击、拖拽、选中等)到具体对象
  2. Canvas上绑定GraphicRaycaster组件后才能响应事件,EventSystem会获取所有绑定了GraphicRaycaster的对象,之后才能对其发起射线检测,所以Canvas越多,效率越低

  3. 响应事件,找到最上层的UI元素,抛出正确的事情响应。

补充

按钮添加点击事件的4种方式

(直接界面上拖拽,脚本绑定,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显示层级

参考资料