[Unity案例]Button的双击和长按

这篇具有很好参考价值的文章主要介绍了[Unity案例]Button的双击和长按。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现内容:

扩展Unity自带的Button组件,在原有的单击事件的基础上实现双击和长按效果;文章来源地址https://www.toymoban.com/news/detail-858437.html

unity button 长按,unity3d,c#,unity,游戏引擎
替换Button组件,通过单选框选择当前执行哪一种事件

代码详解:

  1. 单击事件处理:
    • 通过singleClickEnabled开关控制是否启用单击事件。
    • OnPointerClick方法中,根据按钮的激活状态和可交互状态执行单击事件。
    • 使用Unity的Profiler API添加标记,并触发按钮的单击事件回调。
  2. 双击事件处理:
    • 通过doubleClickEnabled开关控制是否启用双击事件。
    • OnPointerClick方法中,记录点击次数,并根据双击时间阈值判断是否触发双击事件。
    • 如果检测到双击,添加Profiler标记,触发双击事件回调,并重置点击计数。
  3. 长按事件处理:
    • 通过longPressEnabled开关控制是否启用长按事件。
    • OnPointerDown方法中,记录按下时间,并标记长按状态。
    • OnPointerUp方法中,重置长按状态。
    • 使用Update方法定期检测长按,如果达到长按时间阈值,则触发长按事件回调。
  4. 事件回调:
    • 使用ButtonClickedEvent类型的事件回调,可在Inspector中配置。
    • 提供了单击、双击和长按的事件回调,可通过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
}

将新增的属性添加到Inspector面板,具体代码如下:

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);
        }
    }   
}


到了这里,关于[Unity案例]Button的双击和长按的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小程序的点击复制功能和长按复制功能

    前言:         在小程序中实现点击复制功能和长按复制功能,主要使用wx.setClipboardData 小程序的复制功能。 wx.setClipboardData 小程序的复制功能 功能描述 设置系统剪贴板的内容。调用成功后,会弹出 toast 提示\\\"内容已复制\\\",持续 1.5s 参数 Object object 属性 类型 默认值 必填 说明

    2024年02月11日
    浏览(69)
  • 【微信小程序】解决点击(bindtap)和长按(bindlongtap)冲突

    点击事件的执行: 可以看到顺序为: touchstart → touchend → tap 长按事件的执行: 可以看到顺序为: touchstart → longtap → touchend → tap 当我们在一个标签上同时设置 bindtap 和 bindlongtap 时, 会发现长按时先触发bindlongtap的事件,松开后还会触发tap事件,就没有达到预期的效果。

    2024年02月09日
    浏览(48)
  • Unity 实现双击交互

    Unity中要实现单击交互很简单,使用Button、Toggle、EventTrigger事件都可以实现,但是要实现双击某个物体触发交互事件,则需要另外编写脚本。 方法是在EventTrigger中IPointerClickHandler下的点击事件中编写通过短时间间隔内捕获到两次点击事件的算法模拟为双击事件,具体实现如下

    2024年01月19日
    浏览(29)
  • Qt 使用QLabel的派生类实现QLabel的双击响应

            在QLabel中没有双击等事件响应,需要 构建其 派生类 ,自定义 信号(signals) 、重载 事件函数(event) ,最后在Qwidget中 使用connect链接即可 ,进而实现响应功能。         对于其余没有需求事件响应的QObject同样适用。         此外,该功能同样可以 使用 事件过滤器 ,

    2024年02月13日
    浏览(46)
  • 单片机_按键——单击,双击,长按

    调用

    2024年02月16日
    浏览(50)
  • Unity UGUI Button

    目录 Button参数 Button事件 通过可视化界面绑定按钮事件:  通过代码绑定按钮事件

    2024年02月03日
    浏览(42)
  • 如果unity双击无法打开怎么办

    如果unity引擎双击运行之后,首先你的鼠标光标会出现转圈圈,等待一会儿之后,发现圈圈消失,之后没有给出任何提示。 打开任务管理器,看看unity程序是否在后台运行,然后发现,出现一个叫做unitycrashhandler64的进程。 我之前遇到这个问题也很懵,然后去查阅一下发现很多

    2023年04月09日
    浏览(73)
  • 【uni-app】UniApp实现微信小程序中拨打手机电话和长按加微信客服好友(完整代码示例)

    UniApp实现微信小程序中拨打手机电话和长按加微信客服好友(完整代码示例)

    2024年02月11日
    浏览(63)
  • Unity中Button的调色

    Unity的Button功能在游戏开发中是非常常用的,今天笔者来简单介绍一下Button的调色,以便使其更美观。 首先,是之前笔者遇到过的一个问题,在我们新建了一个Button之后,它会像我下面的开始游戏按钮一样,背景呈现出白色,与我们游戏开始菜单的颜色很不符合。  我们可以

    2024年02月08日
    浏览(35)
  • 按键状态机(实现单击,长按,双击)的模块分享

    目录 一、相关说明 二、分析 三、模块代码 三、代码讲解 四、作者的话         1.需要的资源:一个定时器,一个按键。         2.相关设置:利用定时器计时中断,10ms进行一次按键扫描。         3.使用说明:定时器中断的优先级要设置高一点,相关的宏定义可以

    2024年02月07日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包