Unity的Button组件进行扩展
废话不多说,在Untiy中,如果想要对Button等组件进行扩展的话,那么不仅仅只需要将新增的属性设置为public或者增加SerializeField字段就行了的,同时需要对Inspector的GUI面板进行修改,以下直接展示代码:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
using UnityEngine.UI;
using UnityEditor;[CustomEditor(typeof(ButtonExtension))]
public class ButtonExtensionEditor : UnityEditor.UI.ButtonEditor
{public override void OnInspectorGUI(){base.OnInspectorGUI();ButtonExtension myScript = (ButtonExtension)target;myScript.singleClickEnabled = GUILayout.Toggle(myScript.singleClickEnabled, "单击");//创建一个打开/关闭的开关按钮。myScript.doubleClickEnabled = GUILayout.Toggle(myScript.doubleClickEnabled, "双击");if (myScript.doubleClickEnabled){myScript.doubleClickTime = EditorGUILayout.FloatField("双击时间", myScript.doubleClickTime);}myScript.longPressEnabled = GUILayout.Toggle(myScript.longPressEnabled, "长按");if (myScript.longPressEnabled){myScript.minPressTime = EditorGUILayout.FloatField("最小按住时间", myScript.minPressTime);}base.OnInspectorGUI();}
}public class ButtonExtension : Button
{#region 单机双击相关[SerializeField]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
}
参考博客:Unity 编辑器-UGUI拓展Button,一个和原Button一样按钮⭐_unity editor button-CSDN博客
[Unity案例]Button的双击和长按_unity button 长按检测-CSDN博客