Unity 鼠标悬浮监听
2022-10-10 本文已影响0人
114105lijia
使用方法:将PointerUIFlowEvent脚本挂载到需要监听鼠标悬浮的UI下面,然后判断即可。
image.png
![](https://img.haomeiwen.com/i2190276/e0227fa70e696881.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();
}
}