java button按下效果_Unity UGUI 之 实现按钮 Button 长按和双击的功能效果

本教程介绍了如何在Unity UGUI中实现按钮的长按和双击功能。通过创建自定义的MyButton类,继承自Unity的Button组件,添加了OnLongPress和OnDoubleClick事件,分别处理长按和双击操作。在Update方法中检查长按状态,并在OnPointerDown、OnPointerUp和OnPointerExit事件中管理长按计时。双击检测则在OnPointerClick事件中完成,确保在长按触发后不误触发单击事件。
摘要由CSDN通过智能技术生成

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

目录

一、简单介绍

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

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

二、实现原理

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

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

三、注意事项

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

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

四、效果预览

adad62772f921183bd9c5aa7b03adac3.gif

五、实现步骤

1、打开Unity,新建空工程

c3277c00d57b936ae138c72bae734736.png

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

5f3e8af92b5ebd1e48dfd4a84d092de8.png

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

9b283f091668dbc8f58422d361de057e.png

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

01a06253979bb571a72a46b8ffdcfcf0.png

5、添加测试脚本 TestMyButton

532d040b2d5267d1bd8cfac8363c56fa.png

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

76feee869e8732bf741039ab7f0eeee7.png

六、关键代码

1、MyButton.cs

using UnityEngine;

using UnityEngine.UI;

using UnityEngine.EventSystems;

///

/// 我的自定义Button,继承 Button

///

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 长按

///

/// 处理长按

///

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()

{

}

}

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值