Unity重写button按钮添加双击、长按、抬起等检测
using System; using System.Collections; using System.Collections.Generic; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; using UnityEngine.Serialization; using UnityEngine; /// <summary> /// 自己重写的 Button 按钮 /// 1、单击 /// 2、双击 /// 3、长按 /// </summary> public class Button : Selectable, IPointerClickHandler, ISubmitHandler { [Serializable] /// <summary> /// Function definition for a button click event. /// </summary> public class ButtonClickedEvent : UnityEvent { } // Event delegates triggered on click. [FormerlySerializedAs("onClick")] [SerializeField] private ButtonClickedEvent m_OnClick = new ButtonClickedEvent(); [Serializable] public class ButtonUpEvent : UnityEvent { } [SerializeField] [FormerlySerializedAs("Up")] private ButtonUpEvent m_ButtonUp = new ButtonUpEvent(); protected Button() { } public ButtonClickedEvent onClick { get { return m_OnClick; } set { m_OnClick = value; } } private void Press() { if (!IsActive() || !IsInteractable()) return; UISystemProfilerApi.AddMarker("Button.onClick", this); m_OnClick.Invoke(); } [Serializable] /// <summary> /// Function definition for a button click event. /// </summary> public class ButtonLongPressEvent : UnityEvent { } [FormerlySerializedAs("onLongPress")] [SerializeField] private ButtonLongPressEvent m_onLongPress = new ButtonLongPressEvent(); public ButtonLongPressEvent onLongPress { get { return m_onLongPress; } set { m_onLongPress = value; } } [FormerlySerializedAs("OnDoubleClick")] public ButtonClickedEvent m_onDoubleClick = new ButtonClickedEvent(); public ButtonClickedEvent OnDoubleClick { get { return m_onDoubleClick; } set { m_onDoubleClick = value; } } private bool my_isStartPress = false; private float my_curPointDownTime = 0f; private float my_longPressTime = 0.6f; private bool my_longPressTrigger = false; void Update() { CheckIsLongPress(); } void CheckIsLongPress() { if (my_isStartPress && !my_longPressTrigger) { if (Time.time > my_curPointDownTime + my_longPressTime) { my_longPressTrigger = true; my_isStartPress = false; if (m_onLongPress != null) { m_onLongPress.Invoke(); } } } } public virtual void OnPointerClick(PointerEventData eventData) { //(避免已經點擊進入長按后,擡起的情況) if (!my_longPressTrigger) { // 正常單擊 if (eventData.clickCount == 2) { if (m_onDoubleClick != null) { m_onDoubleClick.Invoke(); } }// 雙擊 else if (eventData.clickCount == 1) { onClick.Invoke(); } } } public virtual void OnSubmit(BaseEventData eventData) { Press(); // if we get set disabled during the press // don't run the coroutine. if (!IsActive() || !IsInteractable()) return; DoStateTransition(SelectionState.Pressed, false); StartCoroutine(OnFinishSubmit()); } private IEnumerator OnFinishSubmit() { var fadeTime = colors.fadeDuration; var elapsedTime = 0f; while (elapsedTime < fadeTime) { elapsedTime += Time.unscaledDeltaTime; yield return null; } DoStateTransition(currentSelectionState, false); } public override void OnPointerDown(PointerEventData eventData) { // 按下刷新當前時間 base.OnPointerDown(eventData); my_curPointDownTime = Time.time; my_isStartPress = true; my_longPressTrigger = false; } public override void OnPointerUp(PointerEventData eventData) { // 指針擡起,結束開始長按 base.OnPointerUp(eventData); if (m_ButtonUp != null) { m_ButtonUp.Invoke(); } my_isStartPress = false; } public override void OnPointerExit(PointerEventData eventData) { // 指針移出,結束開始長按,計時長按標志 base.OnPointerExit(eventData); my_isStartPress = false; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)