欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

程序员文章站 2022-04-03 14:09:35
Unity UGUI 之 实现按钮 Button 长按和双击的功能效果一、简单介绍UGUI,是Unity自带的 GUI 系统,有别于 NGUI;使用 UGUI 也能制作出比较酷炫的效果 。本节简单介绍实现 UGUI 按钮的 长按功能,以及Double Click 的功能。二、实现原理1、继承原有的UGUI 的 Button,组件2、在 Button 的上面实现长按和双击事件三、注意事项1、长按和双击事件实现和原有的单击事件方......

 

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

目录

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码


 

一、简单介绍

UGUI,是Unity自带的 GUI 系统,有别于 NGUI;使用 UGUI 也能制作出比较酷炫的效果 。

本节简单介绍实现 UGUI 按钮的 长按功能,以及Double Click 的功能。

 

二、实现原理

1、继承原有的UGUI 的 Button,组件

2、在 Button 的上面实现长按和双击事件

 

三、注意事项

1、长按和双击事件实现和原有的单击事件方法类似(目前不能显示的面板中,估计还有注意什么,知道的朋友可以留言啊)

2、触发双击的时候,可能总是会触发一次单击事件,顺序是先触发单击事件,之后双击事件触发(尝试了一些方法暂时没有方法在取消双击前的单击,知道的朋友留言哈)

 

四、效果预览

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

五、实现步骤

1、打开Unity,新建空工程

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

2、在场景中,简单布局场景,方便测试

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

3、新建脚本 MuButton,继承 Button,代码实现长按和双击效果的逻辑,并添加一个测试脚本,测试 MyButton 效果

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

4、移除Button 上的Button组件,添加 MyButton

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

5、添加测试脚本 TestMyButton

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

6、运行场景,测试效果如上

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

六、关键代码

1、MyButton.cs

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

/// <summary>
/// 我的自定义Button,继承 Button
/// </summary>
public class MyButton : Button
{
   // 构造函数
    protected MyButton()
    {
        my_onDoubleClick = new ButtonClickedEvent();
        my_onLongPress = new ButtonClickedEvent();
    }

    // 长按
    public ButtonClickedEvent my_onLongPress;
    public ButtonClickedEvent OnLongPress
    {
        get { return my_onLongPress; }
        set { my_onLongPress = value; }
    }

    // 双击
    public ButtonClickedEvent my_onDoubleClick;
    public ButtonClickedEvent OnDoubleClick
    {
        get { return my_onDoubleClick; }
        set { my_onDoubleClick = value; }
    }

    // 长按需要的变量参数
    private bool my_isStartPress = false;
    private float my_curPointDownTime = 0f;
    private float my_longPressTime = 0.6f;
    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;
        
    }

    public override void OnPointerExit(PointerEventData eventData)
    {
        // 指針移出,結束開始長按,計時長按標志
        base.OnPointerExit(eventData);
        my_isStartPress = false;
       
    }

    #endregion

    #region 双击(单击)

    public override void OnPointerClick(PointerEventData eventData)
    {
        //(避免已經點擊進入長按后,擡起的情況)
        if (!my_longPressTrigger)
        {
            // 正常單擊 
            if (eventData.clickCount == 2 )
            {
              
                if (my_onDoubleClick != null)
                {
                    my_onDoubleClick.Invoke();
                }
                
            }// 雙擊
            else if (eventData.clickCount == 1)
            {
                onClick.Invoke();
            }
        }
    }
    #endregion


}

 

2、TestMyButton.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestMyButton : MonoBehaviour
{
    public MyButton myButton;

    // Start is called before the first frame update
    void Start()
    {
        myButton.onClick.AddListener(()=> {
            Debug.Log(" myButton.onClick");
        });

        myButton.OnDoubleClick.AddListener(() => {
            Debug.Log(" myButton.OnDoubleClick");
        });

        myButton.OnLongPress.AddListener(() => {
            Debug.Log(" myButton.OnLongPress");
        });
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 

Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

 

 

本文地址:https://blog.csdn.net/u014361280/article/details/107603869