UnityUI:Canvas框架获取鼠标悬浮UI

将下面脚本挂在主体Canvas上,Canvas会对下面所有Image挂上PointerHandler脚本,并且可以通过GetPointEnter方法判断当前鼠标是否悬停在UI上

cs 复制代码
public class BaseCanvas : MonoBehaviour
{
    public static BaseCanvas Main;

    private void Awake()
    {
        Main = this;
        Init();
    }

    public Dictionary<GameObject, PointerHandler> pointerHandler = new Dictionary<GameObject, PointerHandler>();

    void Init()
    {
        List<Image> images = new List<Image>();
        GetChildComponect(transform, ref images);
        foreach (Image image in images)
        {
            image.gameObject.AddComponent<PointerHandler>();
            image.Init();
        }
    }

    void GetChildComponect<T>(Transform t,ref List<T> list)
    {
        if(t.GetComponent<T>() != null)
        {
            list.Add(t.GetComponent<T>());
        }
        if (t.childCount > 0)
        {
            for (int i = 0; i < t.childCount; i++)
            {
                GetChildComponect<T>(t.GetChild(i), ref list);
            }
        }
    }

    public bool GetPointEnter()
    {
        foreach (var handler in pointerHandler)
        {
            if (handler.Value.mouseIn)
            {
                return true;
            }
        }
        return false;
    }
}

下面是PointerHandler脚本,其余脚本可以获取这个脚本并写入事件,这个脚本在触发点击或拖拽时会调用对应的事件

cs 复制代码
using System;
using UnityEngine;
using UnityEngine.EventSystems;

public class PointerHandler : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, IDragHandler
{
    public bool mouseIn;

    public Action<PointerHandler, PointerEventData> pointerEnter = (part, data) => { };
    public Action<PointerHandler, PointerEventData> pointerExit = (part, data) => { };
    public Action<PointerHandler, PointerEventData> pointerDown = (part, data) => { };
    public Action<PointerHandler, PointerEventData> pointerUp = (part, data) => { };
    public Action<PointerHandler, PointerEventData> pointerClick = (part, data) => { };
    public Action<PointerHandler, PointerEventData> pointerDrag = (part, data) => { };

    public void ResetAction()
    {
        pointerEnter = (part, data) => { };
        pointerExit = (part, data) => { };
        pointerDown = (part, data) => { };
        pointerUp = (part, data) => { };
        pointerClick = (part, data) => { };
        pointerDrag = (part, data) => { };
    }

    public void Init()
    {
        BaseCanvas.Main.baseUIEvents[gameObject] = this;
    }

    private void OnDestroy()
    {
        BaseCanvas.Main.baseUIEvents.Remove(gameObject);
    }

    private void OnDisable()
    {
        mouseIn = false;
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        mouseIn = true;
        pointerEnter(this, eventData);
    }
    public void OnPointerExit(PointerEventData eventData)
    {
        mouseIn = false;
        pointerExit(this, eventData);
    }
    public void OnPointerDown(PointerEventData eventData)
    {
        pointerDown(this, eventData);
    }
    public void OnPointerUp(PointerEventData eventData)
    {
        pointerUp(this, eventData);
    }
    public void OnPointerClick(PointerEventData eventData)
    {
        pointerClick(this, eventData);
    }
    public void OnDrag(PointerEventData eventData)
    {
        pointerDrag(this, eventData);
    }
}
相关推荐
波波00717 分钟前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
wujian83114 小时前
怎么用千问生成word文档:从「格式崩」到「一键过」,AI导出鸭打通最后半厘米
人工智能·ai·c#·word·豆包·deepseek·ai导出鸭
zlinear数据采集卡5 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
唐青枫6 小时前
别把 ImmutableArray 当成只读 List:C#.NET 不可变数组深入详解
c#·.net
_ZHOURUI_H_8 小时前
Unity TCP底层极限拆解:粘包、半包、CRC、序列号、双缓冲到底怎么一起工作的?
网络·网络协议·tcp/ip·游戏·unity·游戏引擎·游戏开发
zlinear数据采集卡9 小时前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
KindSuper_liu12 小时前
Unity 游戏网络基础:从 TCP、UDP 到 HTTP、TLS 与 Best HTTP
网络·游戏·unity
花落人散处12 小时前
CDiskClean 开发历程 —— 文件清理_目录树解析实现方案参考
c#
离陌在学C#12 小时前
C# 泛型:从基础到高级应用
开发语言·c#