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);
    }
}
相关推荐
xiaogai_gai3 小时前
BOM 物料清单同步实战:金蝶云星空 → 四化智造 MES 修改场景深度拆解
unity·游戏引擎
天天代码码天天4 小时前
屏幕翻拍满是彩色条纹?用 C# + Vulkan 做了一个去摩尔纹工具,支持单图与文件夹批量
c#·去摩尔纹
2501_930707784 小时前
使用C#代码在 Word 文档中添加、插入或删除页面
开发语言·c#·word
淡海水6 小时前
03-03-架构篇-SGen GC架构解析
unity·架构·c#·gc·sgen
曹牧21 小时前
C#:输入的字符串格式不正确
c#
萌萌的提莫队长1 天前
Unity相机捕捉,图像识别,抠像+合成
opencv·unity
根号五1 天前
JetBrains Rider 使用教程(1)新建解决方案
c#·jetbrains rider
海天鹰1 天前
C#:接收从打开方式打开的参数
c#
宝桥南山1 天前
.NET 11 - 尝试一下Minimal API中的异步验证新特性
microsoft·微软·c#·asp.net·.net·.netcore
开开心心_Every1 天前
文件查重软件批量删除重复文件释放空间
java·开发语言·c#·计算机外设·ocr·excel·perl