Unity Button 事件监听不够,自己拓展一下,添加双击、长按事件
说不多说,上代码。
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class ButtonExtension : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler,
IPointerExitHandler
{
[Header("长按时间")] [SerializeField] private float pressDurationTime = 1;
[Header("双击间隔时间")] [SerializeField] private float doubleClickIntervalTime = 0.5f;
[Header("长按期间是否触发")] public bool responseOnceByPress = false;
public UnityEvent onDoubleClick;
public UnityEvent onPress;
public UnityEvent onClick;
private bool isDown = false;
private bool isPress = false;
private float downTime = 0;
private float clickIntervalTime = 0;
private int clickTimes = 0;
void Update()
{
if (isDown)
{
if (responseOnceByPress && isPress)
return;
downTime += Time.deltaTime;
if (downTime > pressDurationTime)
{
isPress = true;
onPress.Invoke();
}
}
if (clickTimes >= 1)
{
clickIntervalTime += Time.deltaTime;
if (clickIntervalTime >= doubleClickIntervalTime)
{
if (clickTimes >= 2)
onDoubleClick.Invoke();
else
onClick.Invoke();
clickTimes = 0;
clickIntervalTime = 0;
}
}
}
//鼠标按下
public void OnPointerDown(PointerEventData eventData)
{
isDown = true;
downTime = 0;
}
//鼠标抬起
public void OnPointerUp(PointerEventData eventData)
{
isDown = false;
}
//指针出去
public void OnPointerExit(PointerEventData eventData)
{
isDown = false;
isPress = false;
}
//按键按下时调用
public void OnPointerClick(PointerEventData eventData)
{
if (!isPress)
{
//onClick.Invoke();
clickTimes += 1;
}
else
isPress = false;
}
}