using System; using System.Collections; using System.Collections.Generic; using Fort23.UTool; using UnityEngine; using UnityEngine.EventSystems; public class LongPressBtn : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler, IPointerClickHandler { private float _time; public float startTime = 0.5f; public float intervalTime = 0.05f; public Action onClick; /// /// 连按 /// public Action longPress; /// /// 长按结束 /// public Action longPressEnd; /// /// 是否按下状态 /// [HideInInspector] public bool isPressd; private bool _isTriggerLongPress; /// /// 是否触发了长按 /// public bool isTriggerLongPress => _isTriggerLongPress; void OnPress(bool pressed) { if (pressed) // 按下 { isPressd = true; } else // 松开或离开 { if (isPressd) { if (_isTriggerLongPress ) // 触发了长按且不是离开,执行 longPressEnd { longPressEnd?.Invoke(); _isTriggerLongPress = false; } } isPressd = false; _time = 0; } } private void Update() { if (isPressd && !_isTriggerLongPress) { _time += Time.deltaTime; if (_time >= startTime) { _isTriggerLongPress = true; _time -= intervalTime; longPress?.Invoke(); } } else if (isPressd && _isTriggerLongPress) { _time += Time.deltaTime; if (_time >= intervalTime) { _time -= intervalTime; longPress?.Invoke(); } } } /// /// 终止 /// public void Terminated() { if (isPressd) { isPressd = false; if (_isTriggerLongPress) { longPressEnd?.Invoke(); } _isTriggerLongPress = false; _time = 0; } } public void OnPointerDown(PointerEventData eventData) { OnPress(true); } public void OnPointerUp(PointerEventData eventData) { OnPress(false); } public void OnPointerExit(PointerEventData eventData) { OnPress(false); } public void OnPointerClick(PointerEventData eventData) { if (!_isTriggerLongPress) // 只有未触发长按时才触发点击 { onClick?.Invoke(); } isPressd = false; } }