UGUI 对按钮提供了 onClick事件侦听,但是没有长按事件。
网上看了些教程,大都是通过在Update里面计时来实现。
下面通过Invoke来实现。这样不需要每帧都引入Update计算。
Invoke 在一个固定的时间之后调用一个函数。我们将这个时间设置为 holdTime = 1f;单位为秒。当按键松开或者从按钮上移开时,调用CancelInvoke() 取消延时调用。
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class ButtonLongPress : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
[SerializeField]
[Tooltip("How long must pointer be down on this object to trigger a long press")]
private float holdTime = 1f;
// 如果希望侦听点击事件,就把这些注释全掉取消掉
//private bool held = false;
//public UnityEvent onClick = new UnityEvent();
public UnityEvent onLongPress = new UnityEvent();
public void OnPointerDown(PointerEventData eventData)
{
//held = false;
Invoke("OnLongPress", holdTime);
}
public void OnPointerUp(PointerEventData eventData)
{
CancelInvoke("OnLongPress");
//if (!held)
// onClick.Invoke();
}
public void OnPointerExit(PointerEventData eventData)
{
CancelInvoke("OnLongPress");
}
private void OnLongPress()
{
//held = true;
onLongPress.Invoke();
}
}
我们可以将这个脚本挂到Button上。
ButtonLongPressClick.jpg
如果你希望在侦听长按时间的同时,也能侦听点击事件,就把上面脚本中注释掉的代码取消注释就可以了。
网友评论