MyUIButton.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.EventSystems;
  6. using UnityEngine.UIElements;
  7. public class MyUIButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
  8. {
  9. public System.Action onClick;
  10. public System.Action OnPressAndHold;
  11. public bool isUsePressAndHold;
  12. public float holdTime;
  13. private bool isPointerDown = false; // 是否按下
  14. private float pointerDownTimer = 0f; // 按下计时器
  15. public void OnPointerDown(PointerEventData eventData)
  16. {
  17. isPointerDown = true;
  18. pointerDownTimer = 0;
  19. }
  20. public void OnPointerUp(PointerEventData eventData)
  21. {
  22. if (isUsePressAndHold)
  23. {
  24. if (pointerDownTimer < holdTime)
  25. {
  26. onClick?.Invoke();
  27. }
  28. }
  29. else
  30. {
  31. onClick?.Invoke();
  32. }
  33. isPointerDown = false;
  34. }
  35. private void FixedUpdate()
  36. {
  37. if (!isUsePressAndHold)
  38. {
  39. return;
  40. }
  41. if (isPointerDown)
  42. {
  43. pointerDownTimer += Time.deltaTime; // 计时
  44. if (pointerDownTimer >= holdTime) // 达到长按时间
  45. {
  46. OnPressAndHold?.Invoke(); // 触发长按事件
  47. isPointerDown = false; // 重置状态,避免重复触发
  48. }
  49. }
  50. }
  51. }