
新增一个继承自Button的类
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
using UnityEngine.Events;
/// <summary>
/// 长按触发button
/// </summary>
public class LongPressButton : Button
{
// 长按
private ButtonClickedEvent my_onLongPress = new ButtonClickedEvent();
public ButtonClickedEvent OnLongPress
{
get { return my_onLongPress; }
set { my_onLongPress = value; }
}
//抬起
private ButtonClickedEvent pointerUp = new ButtonClickedEvent();
public ButtonClickedEvent OnMouseUp
{
get { return pointerUp; }
set { pointerUp = value; }
}
// 长按需要的变量参数
private bool my_isStartPress = false;
private float my_curPointDownTime = 0f;
[SerializeField]
[Range(0,5)]
private float my_longPressTime = 2f;
private bool my_longPressTrigger = false;
void Update()
{
CheckIsLongPress();
}
#region 长按
/// <summary>
/// 处理长按
/// </summary>
void CheckIsLongPress()
{
if (my_isStartPress && !my_longPressTrigger)
{
if (Time.time > my_curPointDownTime + my_longPressTime)
{
my_longPressTrigger = true;
my_isStartPress = false;
if (my_onLongPress != null)
{
my_onLongPress.Invoke();
}
}
}
}
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);
my_isStartPress = false;
if(my_longPressTrigger)
{
pointerUp.Invoke();
}
}
public override void OnPointerExit(PointerEventData eventData)
{
// 鼠标移出,结束长按、计时标志
base.OnPointerExit(eventData);
my_isStartPress = false;
}
#endregion
}
增加一个对应的Editor类,用来在Inspector窗口中显示Button中的属性。
using UnityEditor;
using UnityEditor.UI;
using UnityEngine;
/// <summary>
/// 长按触发 自定义按钮的 inspector GUI
/// </summary>
[CustomEditor(typeof(LongPressButton), true)]
[CanEditMultipleObjects]
public class MyButtonEditor : ButtonEditor
{
private SerializedProperty my_longPressTime;
protected override void OnEnable()
{
base.OnEnable();
my_longPressTime = serializedObject.FindProperty("my_longPressTime");
}
//并且特别注意,如果用这种序列化方式,需要在 OnInspectorGUI 开头和结尾各加一句 serializedObject.Update(); serializedObject.ApplyModifiedProperties();
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();
serializedObject.Update();
EditorGUILayout.PropertyField(my_longPressTime, new GUIContent("长按时间"), true);
serializedObject.ApplyModifiedProperties();
}
}