美文网首页
Unity 鼠标悬浮监听

Unity 鼠标悬浮监听

作者: 114105lijia | 来源:发表于2022-10-10 10:28 被阅读0次
使用方法:将PointerUIFlowEvent脚本挂载到需要监听鼠标悬浮的UI下面,然后判断即可。 image.png
public class TestMouseSuspension : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        PointerUIFlowEvent pointerUIFlowEvent = transform.GetComponent<PointerUIFlowEvent>();
        pointerUIFlowEvent.OnPointerEnterCallBack = () => {
            print("enter");
        };

        pointerUIFlowEvent.OnPointerExitCallBack = () =>
        {
            print("exit");
        };
    }
}

PointerUIFlowEvent脚本

using System;
using UnityEngine;

public class PointerUIFlowEvent : MonoBehaviour
    {
        RectTransform rect;

        private float xMin;
        private float xMax;

        private float yMin;
        private float yMax;

        Vector3[] worldcorners = new Vector3[4];

        /// <summary>
        /// 鼠标的状态
        /// </summary>
        public PointerStateEnum PointerState { get; private set; }
        private PointerStateEnum pointerStateLast = PointerStateEnum.Out;

        /// <summary>
        /// 鼠标进入UI区域回调
        /// </summary>
        public Action OnPointerEnterCallBack;
        /// <summary>
        /// 鼠标离开UI区域回调
        /// </summary>
        public Action OnPointerExitCallBack;

        public enum PointerStateEnum
        {
            In,
            Out,
        }

        private void Awake()
        {
            rect = transform.GetComponent<RectTransform>();
        }

        void Start()
        {
            CornerUpdate();
        }

        void CornerUpdate()
        {
            rect.GetWorldCorners(worldcorners);

            xMin = worldcorners[0].x;
            xMax = worldcorners[3].x;

            yMin = worldcorners[0].y;
            yMax = worldcorners[1].y;
        }

        Vector3 currMousePosition;

        void CheckUpdate()
        {
            currMousePosition = Input.mousePosition;
            if (currMousePosition.x > xMin && currMousePosition.x < xMax
                && currMousePosition.y > yMin && currMousePosition.y < yMax)
            {
                PointerState = PointerStateEnum.In;
                if (pointerStateLast == PointerStateEnum.Out)
                {
                    pointerStateLast = PointerStateEnum.In;
                    OnPointerEnterCallBack?.Invoke();
                }
            }
            else
            {
                PointerState = PointerStateEnum.Out;
                if (pointerStateLast == PointerStateEnum.In)
                {
                    pointerStateLast = PointerStateEnum.Out;
                    OnPointerExitCallBack?.Invoke();
                }
            }

            pointerStateLast = PointerState;
        }

        void Update()
        {
            CornerUpdate();
            CheckUpdate();
        }
    } 

相关文章

网友评论

      本文标题:Unity 鼠标悬浮监听

      本文链接:https://www.haomeiwen.com/subject/khcoartx.html