我已经知道了,由于事件系统的统一性限制,您需要两个脚本来完成。首先是长按钮按下脚本:
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using System.Collections;
using UnityEngine.UI;
public class LongPressButton : UIBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
[Tooltip("How long must pointer be down on this object to trigger a long press")]
public float durationThreshold = 1.0f;
public UnityEvent onLongPress = new UnityEvent();
private bool isPointerDown = false;
private bool longPressTriggered = false;
private float timePressStarted;
public bool WasLongPressTriggered
{
get;
protected set;
}
private void Update()
{
if (isPointerDown && false == longPressTriggered)
{
if (Time.time - timePressStarted > durationThreshold)
{
longPressTriggered = true;
WasLongPressTriggered = true;
onLongPress.Invoke();
}
}
}
public void OnPointerDown(PointerEventData eventData)
{
timePressStarted = Time.time;
isPointerDown = true;
longPressTriggered = false;
WasLongPressTriggered = false;
}
public void OnPointerUp(PointerEventData eventData)
{
isPointerDown = false;
}
public void OnPointerExit(PointerEventData eventData)
{
isPointerDown = false;
}
}
然后,您将需要一个新的按钮脚本来覆盖旧的基本按钮:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Button2 : Button
{
public bool PreventPropagationOnLongPress;
public override void OnPointerClick(PointerEventData eventData)
{
var longPress = GetComponent<LongPressButton>();
if (longPress == null)
{
base.OnPointerClick(eventData);
}
if(false == longPress.WasLongPressTriggered)
{
base.OnPointerClick(eventData);
}
}
}
这在编辑器中起作用。它尚未在移动设备上进行全面测试,可能在unity edidor中调用点击,但在移动设备中,它可能会在鼠标向上时触发。目前,这将防止事件传播,