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);
    }
}
相关推荐
c#上位机29 分钟前
halcon窗口显示带有箭头的直线
计算机视觉·c#·halcon
秦苒&1 小时前
【C语言指针四】数组指针变量、二维数组传参本质、函数指针变量、函数指针数组
c语言·开发语言·c++·c#
秋雨雁南飞1 小时前
C# 字符串占位
开发语言·c#
正运动技术2 小时前
PC强实时运动控制(一):C#的EtherCAT总线初始化(上)
c#·运动控制·正运动技术·运动控制器·ethercat·正运动·运动控制内核
d111111111d2 小时前
在STM32中,中断服务函数的命名有什么要求?
笔记·stm32·单片机·嵌入式硬件·学习·c#
极客智造3 小时前
深入解析 C# Type 类:解锁反射与动态编程的核心
c#·反射
SmoothSailingT4 小时前
C#——textBox控件(1)
开发语言·c#
superman超哥4 小时前
仓颉语言中并发集合的实现深度剖析与高性能实践
开发语言·后端·python·c#·仓颉
工程师0074 小时前
C#中的服务注册剖析
c#·服务注册
张人玉5 小时前
c#DataTable类
数据库·c#