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

目录

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

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码

七、自己完全重写 Button (面板有 onClick, onLongPress, onDoubleClick 事件添加)


一、简单介绍

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

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

二、实现原理

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

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

三、注意事项

1、长按和双击事件实现和原有的单击事件方法类似(目前不能显示的面板中,估计还有注意什么,知道的朋友可以留言啊(可能是继承 Button 子类已经有 UnityEvent (还是奇怪)),后面脚本有完全重写的Button 中面板有 onClick, onLongPress, onDoubleClick 事件)

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

四、效果预览

五、实现步骤

1、打开Unity,新建空工程

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

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

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

5、添加测试脚本 TestMyButton

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

六、关键代码

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 updatevoid 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 framevoid Update(){}
}

七、自己完全重写 Button (面板有 onClick, onLongPress, onDoubleClick 事件添加)

(注意:使用方法原有的Button一样)

1、样式

2、代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;
using UnityEngine.Serialization;
using UnityEngine;namespace XANTools
{/// <summary>/// 自己重写的 Button 按钮/// 1、单击/// 2、双击/// 3、长按/// </summary>    public class MyButtonXAN : Selectable, IPointerClickHandler, ISubmitHandler{[Serializable]/// <summary>/// Function definition for a button click event./// </summary>public class ButtonClickedEvent : UnityEvent { }// Event delegates triggered on click.[FormerlySerializedAs("onClick")][SerializeField]private ButtonClickedEvent m_OnClick = new ButtonClickedEvent();protected MyButtonXAN(){ }public ButtonClickedEvent onClick{get { return m_OnClick; }set { m_OnClick = value; }}private void Press(){if (!IsActive() || !IsInteractable())return;UISystemProfilerApi.AddMarker("Button.onClick", this);m_OnClick.Invoke();}[Serializable]/// <summary>/// Function definition for a button click event./// </summary>public class ButtonLongPressEvent : UnityEvent { }[FormerlySerializedAs("onLongPress")][SerializeField]private ButtonLongPressEvent m_onLongPress = new ButtonLongPressEvent();public ButtonLongPressEvent onLongPress{get { return m_onLongPress; }set { m_onLongPress = value; }}[FormerlySerializedAs("OnDoubleClick")]public ButtonClickedEvent m_onDoubleClick = new ButtonClickedEvent();public ButtonClickedEvent OnDoubleClick{get { return m_onDoubleClick; }set { m_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();}void CheckIsLongPress(){if (my_isStartPress && !my_longPressTrigger){if (Time.time > my_curPointDownTime + my_longPressTime){my_longPressTrigger = true;my_isStartPress = false;if (m_onLongPress != null){m_onLongPress.Invoke();}}}}public virtual void OnPointerClick(PointerEventData eventData){//(避免已經點擊進入長按后,擡起的情況)if (!my_longPressTrigger){// 正常單擊 if (eventData.clickCount == 2){if (m_onDoubleClick != null){m_onDoubleClick.Invoke();}}// 雙擊else if (eventData.clickCount == 1){onClick.Invoke();}}}public virtual void OnSubmit(BaseEventData eventData){Press();// if we get set disabled during the press// don't run the coroutine.if (!IsActive() || !IsInteractable())return;DoStateTransition(SelectionState.Pressed, false);StartCoroutine(OnFinishSubmit());}private IEnumerator OnFinishSubmit(){var fadeTime = colors.fadeDuration;var elapsedTime = 0f;while (elapsedTime < fadeTime){elapsedTime += Time.unscaledDeltaTime;yield return null;}DoStateTransition(currentSelectionState, false);}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;}}
}

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

  1. Unity UGUI Button 中文详解-Chinar

    Chinar blog :www.chinar.xin Unity UGUI 完整系列教程 (Chinar中文图解) Unity UGUI Button 组件 本文提供全流程,中文翻译. Chinar ...

  2. Unity UGUI 之 实现 Text 文本文字过长,省略号显示(TextMeshPro 和常规 Text 二种方法)

    Unity UGUI 之 实现 Text 文本文字过长,省略号显示(TextMeshPro 和常规 Text 二种方法) 目录 Unity UGUI 之 实现 Text 文本文字过长,省略号显示(Te ...

  3. Unity3D之UGUI基础4:Button按钮

    前文:https://blog.csdn.net/Jaihk662/article/details/87866889(Text文本) 一.Button组件分析 当你新建Button时,会附送一个Tex ...

  4. 【Unity】UI交互组件之按钮Button可选基类总结

    按钮(Button) 按钮控件可以响应于用户的点击并触发启动或确认操作,比如Web表单上的Submit及Cancel按钮.主要有三大属性:Interactable / Transition / Nav ...

  5. Unity UGUI开发设计及案例讲解

    Unity--UGUI开发设计及案例讲解 1. Unity4.6跟以前的版本的最大区别首先在于在层级视图中点鼠标右键时出现的弹出菜单上,它把以前许多的菜单项进行了归类,比如cube sphere ca ...

  6. unity UGUI系统梳理 -交互组件

    概述 unity 中的交互组件可用于处理交互,例如鼠标或触摸事件以及使用键盘或控制器进行的交互 1.按钮 (Button) Button详解 2.开关 (Toggle) Background:背景图片 ...

  7. Unity UGUI InputField 中文详解-Chinar

    Chinar blog :www.chinar.xin Unity UGUI 完整系列教程 (Chinar中文图解) Unity UGUI InputField组件 本文提供全流程,中文翻译. Chi ...

  8. Unity UGUI 效果 之 UI 元素 多边形UI (例如雷达图,圆形,不规则多边形 UI等)显示 的简单实现的几种方法整理

    Unity UGUI 效果 之 UI 元素 多边形UI (例如雷达图,圆形,不规则多边形 UI等)显示 的简单实现的几种方法整理 目录 Unity UGUI 效果 之 UI 元素 多边形UI (例如雷 ...

  9. MFC 基础知识:对话框背景添加图片和按钮Button添加图片

    很长时间没有接触MFC相关的知识了,我大概是在大二时候学习的MFC相关知识及图像处理,现在由于要帮个朋友完成个基于C++的程序,所以又回顾了下相关知识.的确,任何知识一段时间过后都比较容易忘记,但回顾 ...

最新文章

  1. linux系统基础入门,虚惊一场
  2. Bellman-Ford算法——为什么要循环n-1次?图有n个点,又不能有回路,所以最短路径最多n-1边。又因为每次循环,至少relax一边所以最多n-1次就行了!...
  3. python 搜索二维矩阵
  4. Java技术分享之变量命名
  5. 给字母保密的c语言,C语言练习题
  6. 2020云栖大会,宜搭发布专业开发者能力,助力政企数字化转型——阿里云开发者社区
  7. 华为数通HCIE面试题目解密系列之RSTP边缘端口
  8. [转载] python 列表List中index函数的坑
  9. cmd 看图片十六进制_Fun Python | 女朋友让我把这网站上的图片都下载下来
  10. html5图片自动轮播纯代码,HTML5的自定义data-*实现图片切换或者轮播(代码实例)...
  11. Linux 如何对http服务器进行压力测试
  12. 定义平行四边形类,继承四边形类,增加判断是否为平行四边形的函数
  13. 五、数组(高琪java300集+java从入门到精通笔记)
  14. 计算机最大数最小数的函数,Excel函数教程: 求最大、最小、中间数、最多数-excel技巧-电脑技巧收藏家...
  15. 网络保护第三层 WAF-网络应用防火墙
  16. 北京大学可视化发展前沿研究生暑期学校Day3
  17. 快排及其优化(C语言)
  18. 看了下大厂程序员的工资表,我酸了.....
  19. selenium抓取斗鱼直播平台数据
  20. 程序人生 - 变脸的原理

热门文章

  1. ESP32设备驱动-MLX90393磁场传感器驱动
  2. 织梦标签语法大全(推荐收藏)
  3. 【Linux学习】RPM包制作
  4. 手机 App 是如何通过 IoT 物联网控制饮水机出水的?
  5. 7-16 毕业聚会 (10分)
  6. 整型与布尔型的转换(C++)
  7. Mysql 根据分隔符拆分某列分割成多条记录 学习教程
  8. 数据链项目经理需要哪些知识储备?
  9. 使用Reachability监测网络变化-陈鹏
  10. 微信小程序常用快捷键