我们先去思考。

点击的过程:鼠标按下、然后鼠标抬起。

长按的过程:鼠标按下、等待几秒、鼠标抬起。

鼠标按下和抬起的过程,我们可以实现UGUI中的IPointerDownHandler、IPointerUpHandler接口去完成。

  • 按下时,记录按下的时间

  • 抬起时,记录抬起的时间

那么只需要知道抬起的时间 减去 按下的时间,就可以知道长按的时间。

我们可以规定一个长按的阈值时间,只要长按的时间大于这个阈值,就说明触发了长按事件。

using UnityEngine;
using UnityEngine.EventSystems;

namespace Core.GameLevel
{
    public class CheckCardBtn : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
    {
        public float longPressThreshold = 2f; // 长按阈值(秒)
        private bool _isPressed = false; // 是否正在按下
        private float _pressStartTime; // 按下开始时间

        public void OnPointerDown(PointerEventData eventData)
        {
            _isPressed = true;
            _pressStartTime = Time.time;
        }

        public void OnPointerUp(PointerEventData eventData)
        {
            if (_isPressed)
            {
                _isPressed = false;
                if (Time.time - _pressStartTime < longPressThreshold)
                {
                    // 触发点击事件
                    OnClick();
                }
            }
            
        }

        private void Update()
        {
            if (_isPressed && Time.time - _pressStartTime >= longPressThreshold)
            {
                LongPress();
                // 停止检测
                _isPressed = false;
            }
        }

        private void LongPress()
        {
            Debug.Log("长按事件触发");
        }

        private void OnClick()
        {
            Debug.Log("点击事件触发");
        }
    }
}