UGUI_PointerEventData()__检测鼠标点击的位置上,所包含的全部UI控件

需求:有时候拖动/点击UI时,需要判断鼠标所在位置上,对重叠的UI进行分别的处理

实现:利用PointerEventData()

 

一;判断当前鼠标上重叠的UI有多少个

    private int IsPointerOverUIObject()
    {
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);

        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

        return results.Count;

 

二:继承IPointerClickHandler接口(点击),实现OnPointerClick(PointerEventData eventData)方法,可用于触发点击位置上的全部UI,其他接口也类似这样

 

    public void OnPointerClick(PointerEventData eventData)
    {
        PassEvent(eventData, ExecuteEvents.pointerClickHandler);
    }

    //把事件透下去
    public void PassEvent<T>(PointerEventData data,
### Unity UGUI 系统架构概述 Unity 的 UGUI(User Interface Graphical User Interface)系统是一种基于 3D 渲染技术的 UI 架构,其核心设计理念是为了简化复杂用户界面的开发流程,并提升运行时性能。UGUI 的系统架构主要由以下几个部分组成: #### 1. **事件系统** 事件系统负责捕获用户的输入并将这些输入传递给相应的 UI 元素。`EventSystem` 是整个事件机制的核心组件,它通过 `PointerEventData` 和其他数据结构来跟踪鼠标、触摸屏或其他输入设备的状态变化[^2]。 #### 2. **Canvas 及渲染层次** `Canvas` 是 UGUI 中所有 UI 元素的容器,所有的 UI 控件都必须依附于某个 Canvas 上才能被显示出来。Canvas 支持三种渲染模式:Screen Space - Overlay、Screen Space - Camera 和 World Space。每种模式决定了 UI 如何与场景中的摄像机和其他对象相互作用[^1]。 #### 3. **图形组件** 图形组件主要包括 `Image`, `RawImage`, 和 `Text` 等类,它们继承自 `Graphic` 类,用于表示可视化的 UI 元素。这些组件可以通过设置不同的材质和纹理属性来自定义外观。 #### 4. **交互控件** 交互控件如 `Button`, `Slider`, `Toggle`, `Dropdown` 等均派生自 `Selectable` 抽象基类。这些控件提供了丰富的内置行为逻辑以便快速搭建可点击或拖拽的功能模块。 #### 5. **布局控制器** 为了自动调整子项的位置大小关系,UGUI 提供了一系列实现 `ILayoutController` 接口的布局管理器,比如水平/垂直布局组 (`HorizontalLayoutGroup`, `VerticalLayoutGroup`) 或者网格布局(`GridLayoutGroup`)等。 #### 6. **遮罩功能** 当某些区域需要隐藏部分内容时可以利用 Mask 功能。标准做法是使用 `Mask` 或更高效的 `RectMask2D` 来限定可见范围内的像素点[^2]。 #### 7. **Draw Call 合并策略** 由于每一个独立绘制的对象都会增加 Draw Calls 数量从而影响帧率表现,因此 UGUI 设计了一套批量处理机制——即所谓的 Sprite Atlas(精灵合集)。通过将相似材质贴图打包进同一张大图里再统一提交给 GPU 进行渲染操作,极大地减少了不必要的切换次数,提高了整体效率[^3]。 以下是关于如何构建一个简单的圆形裁剪效果的例子作为补充说明: ```csharp using UnityEngine; public class CircleClipExample : MonoBehaviour { public Material circleMaterial; private void OnRenderObject() { GL.PushMatrix(); Graphics.DrawMeshNow(MeshGenerator.GetCircleMesh(), transform.localToWorldMatrix); GL.PopMatrix(); } } ``` 此脚本配合前面提到过的自定义 Shader 实现了更加灵活可控的效果展示方式[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值