Unity实现按钮Button多功能(长按,双击)

Unity实现按钮Button多功能(长按,双击)。

今天在做游戏的时候突发奇想,为什么Unity只有单击捏?例如:以前的iPhone的Home键双击就是任务栏,单击就是回到主界面。那么在Unity应该也能实现吧(好像没什么关联。。。),毕竟现在很多游戏都存在双击的功能。于是我去网络上查找并学习了下,把心得写在这,方便大家可以参考参考。

思路

既然我们需要手动写一个按钮,那么就需要去监听GameObject的点击事件。这里我设置了几个Public变量,并且实现了几个鼠标事件的接口,具体的代码如下:

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class ButtonMySelf : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
    #region Public Variables

    public float pressDurationTime = 1;
    public float doubleClickIntervalTime = 0.5f;

    public UnityEvent onDoubleClick;
    public UnityEvent onPress;
    public UnityEvent onClick;

    #endregion

    #region Private Variables

    private bool isDown = false;
    private bool isPress = false;
    private float downTime = 0;

    private float clickIntervalTime = 0;
    private int clickTimes = 0;


    #endregion

    #region Unity Methods

    // Update is called once per frame
    void Update()
    {
        if (isDown)
        {
            if (isPress) return;
            downTime += Time.deltaTime;
            if (downTime > pressDurationTime)
            {
                isPress = true;
                onPress.Invoke();
                downTime = 0;
            }
        }
        if (clickTimes >= 1)
        {
            clickIntervalTime += Time.deltaTime;
            if (clickIntervalTime >= doubleClickIntervalTime)
            {
                if (clickTimes >= 2)
                {
                    onDoubleClick.Invoke();
                }
                else
                {
                    onClick.Invoke();
                }
                clickTimes = 0;
                clickIntervalTime = 0;
                    
            }
        }

    }

    #endregion


    #region Public Methods

    public void OnPointerDown(PointerEventData eventData)
    {
        isDown = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isDown = false;
        if (!isPress) clickTimes += 1;
        isPress = false;
    }

    #endregion
}

这里就跟大家说说思路吧,首先当点击的时候我们会把isDown设置为true,然后在每一帧进行检测是否按下了鼠标(也就是监听isDown)。如果鼠标点击下去了那么我们会先进行判断是否为按压,按压的话取消这一帧鼠标的判断(因为当你按压的时候isDown也是一直为true)。如果不是按压事件,那么就会开始按秒计时,当你的按压时间大于了pressDurationTime,就会把isPress设置为真,并且调用按压事件的函数,最后把按压计时归零!!!
下一个if的判断使用来判断双击的,在OnPoinerUp这个函数里面,会对你的点击次数进行计数(按下并放开记为一次),当然如果你是按压状态那么就算你放开了他也不会进行计数这个动作。当你点击一次以后他就会开始if里面的判断啦,也就是开始第一次点击后的计时,当你第一次点击后的计时大于等于你规定的双击时间doubleClickIntervalTime时候就会进行判断:在这个时间段里面你是不是又点击了一次(当然你要是在规定时间里面点击了一百次,那。。。也算你双击啦)。如果又点击了一次那么就会执行双击的事件,要不然就执行单击事件。
然后把它挂在你的GameObject下。

挂脚本

最后

然后就是写个自己想要双击实现的脚本然后挂上去就可以用啦!!!
我的代码是这样的:

using UnityEngine;
using UnityEngine.UI;

public class ButtonTest : MonoBehaviour
{
    #region Private Variables

    [SerializeField] private GameObject showTips = null;
    [SerializeField] private float DuringTPOT = 2f;

    private float timeCount = 0;

    #endregion

    #region Unity Methods

    // Start is called before the first frame update
    void Start()
    {
        ButtonMySelf btn = GetComponent<ButtonMySelf>();
        btn.onClick.AddListener(Click);
        btn.onPress.AddListener(Press);
        btn.onDoubleClick.AddListener(DoubleCick);
    }

    


    // Update is called once per frame
    void Update()
    {
        if (timeCount >= 0 && showTips.activeSelf == true && showTips != null)
        {
            timeCount += Time.deltaTime;
            if (timeCount >= DuringTPOT) showTips.SetActive(false);
        }
    }

    #endregion

    #region Private Methods

    private void DoubleCick()
    {
        if (showTips == null)
        {
            Debug.LogWarning("Losting Text of GameObject,Please Adding.");
            return;
        }
        
        showTips.GetComponent<Text>().text = "开启免费奖励模式";
        showTips.SetActive(true);
        timeCount = 0;
    }

    private void Press()
    {
        if (showTips == null)
        {
            Debug.LogWarning("Losting Text of GameObject,Please Adding.");
            return;
        }
        showTips.GetComponent<Text>().text = "关闭了免费奖励模式";
        showTips.SetActive(true);
        timeCount = 0;
    }

    private void Click()
    {
        if (showTips == null)
        {
            Debug.LogWarning("Losting Text of GameObject,Please Adding.");
            return;
        }
        showTips.GetComponent<Text>().text = "发现了隐藏按钮";
        showTips.SetActive(true);
        timeCount = 0;
    }

    #endregion
}

上面是我用来做游戏Debug的。。。嘻嘻
我的代码写的不是很好,我也是模仿别人写的。
刚刚接触代码和做游戏一个月,写的不好的地方希望能多多包容。当然也可以指出错误,互相学习。^^
最后的最后,附上我参考别人的链接。毕竟也是模仿别人写的(大部分都是),我只是把他的代码语言化了一点。(有一些接口我没用到,具体的可以看看原链接)
链接:https://blog.csdn.net/shuai1210/article/details/83866811

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在 中实现按钮双击事件功能,可以通过以下步骤: 1. 在 Unity 的场景中创建一个按钮,并为其添加 Button 组件。 2. 创建一个脚本,并将其挂载到按钮上,用于实现双击事件功能。 3. 在脚本中定义一个变量,用于记录上一次点击按钮的时间。 4. 在按钮的点击事件处理函数中,判断当前时间与上一次点击时间的时间差是否小于指定时间(例如500毫秒),如果是,则触发双击事件处理函数。 具体实现代码如下: ```csharp using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using System.Collections; public class DoubleClickButton : MonoBehaviour { // 双击事件处理函数 public UnityEvent onDoubleClick; // 双击时间间隔(毫秒) public float doubleClickInterval = 500f; // 上一次点击时间 private float lastClickTime; // 按钮点击事件处理函数 public void OnButtonClick() { float currentTime = Time.time * 1000f; if (currentTime - lastClickTime < doubleClickInterval) { onDoubleClick.Invoke(); } lastClickTime = currentTime; } } ``` 在上述代码中,我们定义了一个 DoubleClickButton 类,并为其添加了 onDoubleClick 事件处理函数和 doubleClickInterval 双击时间间隔变量。在 OnButtonClick 函数中,我们获取当前时间与上一次点击时间的时间差,如果小于双击时间间隔,则触发 onDoubleClick 事件处理函数,并更新上一次点击时间。将该脚本挂载到按钮上后,就可以实现按钮双击事件功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值