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);
    }
}
相关推荐
CodeCraft Studio10 小时前
3D文档控件Aspose.3D实用教程:使用 C# 构建 OBJ 到 U3D 转换器
开发语言·3d·c#·3d渲染·aspose·3d文件格式转换·3d sdk
郝学胜-神的一滴10 小时前
Horse3D游戏引擎研发笔记(七):在QtOpenGL环境下,使用改进的Uniform变量管理方式绘制多彩四边形
c++·3d·unity·游戏引擎·图形渲染·虚幻·unreal engine
唐青枫11 小时前
ValueTask 实战指南:解锁 .NET 异步编程的性能秘密
c#·.net
chenglin01611 小时前
C#_gRPC
开发语言·c#
巨龙之路13 小时前
Unity的Cursor.lockState
unity·游戏引擎
★YUI★14 小时前
学习制作记录(选项UI以及存档系统)8.24
学习·游戏·ui·unity·c#
liulilittle16 小时前
.NET反射与IL反编译核心技术
开发语言·数据库·c#·.net·反射·反编译·il
月巴月巴白勺合鸟月半16 小时前
Teams Bot机器人实时语音识别的多引擎的处理
机器人·c#
hixiong12317 小时前
C# 编写一个XmlToDota的转换工具
开发语言·人工智能·yolo·c#