Unity-长按触发事件按钮(UGUI)

新增一个继承自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();
    }
}

 

点赞

发表回复

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像