赞
踩
扩展Unity自带的Button组件,在原有的单击事件的基础上实现双击和长按效果;
singleClickEnabled
开关控制是否启用单击事件。OnPointerClick
方法中,根据按钮的激活状态和可交互状态执行单击事件。doubleClickEnabled
开关控制是否启用双击事件。OnPointerClick
方法中,记录点击次数,并根据双击时间阈值判断是否触发双击事件。longPressEnabled
开关控制是否启用长按事件。OnPointerDown
方法中,记录按下时间,并标记长按状态。OnPointerUp
方法中,重置长按状态。Update
方法定期检测长按,如果达到长按时间阈值,则触发长按事件回调。ButtonClickedEvent
类型的事件回调,可在Inspector中配置。- using UnityEngine;
- using UnityEngine.EventSystems;
- using UnityEngine.Serialization;
- using UnityEngine.UI;
-
- public class ButtonExtension : Button
- {
- #region 单机双击相关
-
- public bool singleClickEnabled = true;
- public bool doubleClickEnabled = false;
- public float doubleClickTime = 0.3f;
-
- private float lastClickTime = float.NegativeInfinity;
- private int clickCount = 0;
-
- [FormerlySerializedAs("onDoubleClick")]
- [SerializeField]
- private ButtonClickedEvent doubleClickEvent = new ();
-
- public ButtonClickedEvent onDoubleClick
- {
- get => doubleClickEvent;
- set => doubleClickEvent = value;
- }
-
- public override void OnPointerClick(PointerEventData eventData)
- {
- if(!IsActive() && !interactable)
- return;
-
- if (singleClickEnabled)
- {
- UISystemProfilerApi.AddMarker("Button.onClick", this);
- onClick?.Invoke();
- Debug.LogError("单击");
- }
-
- if (doubleClickEnabled)
- {
- clickCount++;
- if (clickCount >= 2)
- {
- if (Time.realtimeSinceStartup - lastClickTime < doubleClickTime)
- {
- UISystemProfilerApi.AddMarker("Button.onDoubleClick", this);
- onDoubleClick?.Invoke();
- Debug.LogError("双击");
- lastClickTime = float.NegativeInfinity;
- clickCount = 0;
- }
- else
- {
- clickCount = 1;
- lastClickTime = Time.unscaledTime;
- }
- }
- else
- {
- lastClickTime = Time.unscaledTime;
- }
- }
- }
-
- #endregion
-
- #region 长按相关
-
- public bool longPressEnabled = false;
-
- private float lastPressTime = 0;
-
- public float minPressTime = 0.5f;
-
- private bool isPressing = false;
-
- private bool hasInvokedLongPress = false;
-
- [FormerlySerializedAs("onLongPress")]
- [SerializeField]
- private ButtonClickedEvent longPressEvent = new();
-
- public ButtonClickedEvent onLongPress
- {
- get => longPressEvent;
- set => longPressEvent = value;
- }
-
- public override void OnPointerDown(PointerEventData eventData)
- {
- base.OnPointerDown(eventData);
- if (longPressEnabled)
- {
- hasInvokedLongPress = false;
- isPressing = true;
- lastPressTime = Time.unscaledTime;
- }
- }
-
- public override void OnPointerUp(PointerEventData eventData)
- {
- base.OnPointerUp(eventData);
- isPressing = false;
- hasInvokedLongPress = false;
- }
-
- private void Update()
- {
- DealLongPress();
- }
-
- private void DealLongPress()
- {
- if(hasInvokedLongPress) return;
- if (isPressing)
- {
- if (Time.unscaledTime - lastPressTime >= minPressTime)
- {
- UISystemProfilerApi.AddMarker("Button.onLongPress", this);
- onLongPress?.Invoke();
- hasInvokedLongPress = true;
- Debug.LogError("执行长按事件");
- }
- }
- }
-
- #endregion
- }
-
- using UnityEngine;
-
- namespace UnityEditor.UI
- {
- [CustomEditor(typeof(ButtonExtension), true)]
- [CanEditMultipleObjects]
- public class ButtonExInspector : SelectableEditor
- {
- private ButtonExtension buttonExtension;
-
- SerializedProperty onDoubleClickProperty;
- SerializedProperty onClickProperty;
- SerializedProperty onLongPressProperty;
-
- protected override void OnEnable()
- {
- base.OnEnable();
- onDoubleClickProperty = serializedObject.FindProperty("doubleClickEvent");
- onClickProperty = serializedObject.FindProperty("m_OnClick");
- onLongPressProperty = serializedObject.FindProperty("longPressEvent");
- }
-
- public override void OnInspectorGUI()
- {
- base.OnInspectorGUI();
- serializedObject.Update();
- buttonExtension = (ButtonExtension)target;
- EditorGUILayout.Space();
-
- buttonExtension.singleClickEnabled = EditorGUILayout.Toggle("启用单击", buttonExtension.singleClickEnabled);
- if (buttonExtension.singleClickEnabled)
- {
- buttonExtension.doubleClickEnabled = false;
- buttonExtension.longPressEnabled = false;
- EditorGUILayout.PropertyField(onClickProperty);
- }
-
- buttonExtension.doubleClickEnabled = EditorGUILayout.Toggle("启用双击", buttonExtension.doubleClickEnabled);
- if (buttonExtension.doubleClickEnabled)
- {
- buttonExtension.doubleClickTime = EditorGUILayout.FloatField("双击间隔", buttonExtension.doubleClickTime);
- buttonExtension.singleClickEnabled = false;
- buttonExtension.longPressEnabled = false;
- EditorGUILayout.PropertyField(onDoubleClickProperty);
- }
-
- buttonExtension.longPressEnabled = EditorGUILayout.Toggle("启用长按", buttonExtension.longPressEnabled);
- if(buttonExtension.longPressEnabled)
- {
- buttonExtension.minPressTime = EditorGUILayout.FloatField("长按时间", buttonExtension.minPressTime);
- buttonExtension.singleClickEnabled = false;
- buttonExtension.doubleClickEnabled = false;
- EditorGUILayout.PropertyField(onLongPressProperty);
- }
-
- serializedObject.ApplyModifiedProperties();
- if(GUI.changed)
- EditorUtility.SetDirty(target);
- }
- }
- }
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。