using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; public class LongPressOrClickTrigger : UIBehaviour, IPointerDownHandler, IPointerUpHandler { public UnityEvent onLongPress = new UnityEvent(); public UnityEvent onDown = new UnityEvent(); public UnityEvent onUp = new UnityEvent(); private bool isPointerDown = false; private bool longPressTriggered = false; private float timePressStarted; /// 指针在按钮上按下后至抬起前为 true;划出按钮区域不中断(与常见按住交互一致)。 public bool IsPressing => isPointerDown; private void Update() { if (isPointerDown && !longPressTriggered) { if (Time.time - timePressStarted > 0.2f) { onLongPress.Invoke(); longPressTriggered = true; } } } public void OnPointerDown(PointerEventData eventData) { timePressStarted = Time.time; isPointerDown = true; longPressTriggered = false; onDown.Invoke(); } public void OnPointerUp(PointerEventData eventData) { isPointerDown = false; onUp.Invoke(); } protected override void OnDisable() { base.OnDisable(); isPointerDown = false; longPressTriggered = false; } }