using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using UnityEngine.Events; 
 | 
using UnityEngine.EventSystems; 
 | 
using UnityEngine.Serialization; 
 | 
using UnityEngine.UI; 
 | 
  
 | 
public class LongPressButton : ButtonEx 
 | 
{ 
 | 
    public class ButtonPressEvent : UnityEvent { } 
 | 
  
 | 
    //长按监听 
 | 
    [FormerlySerializedAs("onPress")] 
 | 
    [SerializeField] 
 | 
    private ButtonPressEvent m_OnPress = new ButtonPressEvent(); 
 | 
    public ButtonPressEvent onPress 
 | 
    { 
 | 
        get { return m_OnPress; } 
 | 
        set { m_OnPress = value; } 
 | 
    } 
 | 
  
 | 
    [SerializeField] 
 | 
    float m_LongPressCheckTime = 0.3f; 
 | 
    public float longPressCheckTime 
 | 
    { 
 | 
        get { return m_LongPressCheckTime; } 
 | 
        set { m_LongPressCheckTime = value; } 
 | 
    } 
 | 
    [SerializeField] 
 | 
    float m_LongPressIntervalTime = 0.1f; 
 | 
    public float longPressIntervalTime 
 | 
    { 
 | 
        get { return m_LongPressIntervalTime; } 
 | 
        set { m_LongPressIntervalTime = value; } 
 | 
    } 
 | 
  
 | 
    float m_PressTime = 0.0f; 
 | 
    float m_PressIntervalTime = 0.0f; 
 | 
    bool m_LongPress = false; 
 | 
    bool m_IsButtonDown = false; 
 | 
  
 | 
    public override void OnPointerClick(PointerEventData eventData) 
 | 
    { 
 | 
        if (m_LongPress) 
 | 
        { 
 | 
            m_LongPress = false; 
 | 
            return; 
 | 
        } 
 | 
        base.OnPointerClick(eventData); 
 | 
    } 
 | 
  
 | 
    public override void OnPointerDown(PointerEventData eventData) 
 | 
    { 
 | 
        base.OnPointerDown(eventData); 
 | 
        m_PressTime = 0.0f; 
 | 
        m_PressIntervalTime = 0.0f; 
 | 
        m_IsButtonDown = true; 
 | 
    } 
 | 
  
 | 
    public override void OnPointerUp(PointerEventData eventData) 
 | 
    { 
 | 
        base.OnPointerUp(eventData); 
 | 
        m_IsButtonDown = false; 
 | 
    } 
 | 
  
 | 
    public override void OnPointerExit(PointerEventData eventData) 
 | 
    { 
 | 
        base.OnPointerExit(eventData); 
 | 
        m_IsButtonDown = false; 
 | 
        m_LongPress = false; 
 | 
    } 
 | 
  
 | 
    private void Update() 
 | 
    { 
 | 
        if (m_IsButtonDown) 
 | 
        { 
 | 
            if (!this.interactable || !this.IsActive() || !this.enabled) 
 | 
            {  
 | 
                // 如果按钮不可用,则取消长按状态 
 | 
                m_IsButtonDown = false; 
 | 
                m_LongPress = false; 
 | 
                return; 
 | 
            } 
 | 
            m_PressTime += Time.deltaTime; 
 | 
            if (m_PressTime < m_LongPressCheckTime) 
 | 
            { 
 | 
                return; 
 | 
            } 
 | 
  
 | 
            if (m_PressIntervalTime >= m_LongPressIntervalTime) 
 | 
            { 
 | 
                onPress.Invoke(); 
 | 
                m_PressIntervalTime = 0.0f; 
 | 
            } 
 | 
            m_PressIntervalTime += Time.deltaTime; 
 | 
            m_LongPress = true; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    protected override void OnEnable() 
 | 
    { 
 | 
        base.OnEnable(); 
 | 
        m_LongPress = false; 
 | 
        m_IsButtonDown = false; 
 | 
    } 
 | 
} 
 |