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

时间:2025-04-15 09:58:04

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

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脚本,其余脚本可以获取这个脚本并写入事件,这个脚本在触发点击或拖拽时会调用对应的事件

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);
    }
}