当前位置: 首页 > news >正文

Unity的Button组件进行扩展

废话不多说,在Untiy中,如果想要对Button等组件进行扩展的话,那么不仅仅只需要将新增的属性设置为public或者增加SerializeField字段就行了的,同时需要对Inspector的GUI面板进行修改,以下直接展示代码:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
using UnityEngine.UI;
using UnityEditor;[CustomEditor(typeof(ButtonExtension))]
public class ButtonExtensionEditor : UnityEditor.UI.ButtonEditor    
{public override void OnInspectorGUI(){base.OnInspectorGUI();ButtonExtension myScript = (ButtonExtension)target;myScript.singleClickEnabled = GUILayout.Toggle(myScript.singleClickEnabled, "单击");//创建一个打开/关闭的开关按钮。myScript.doubleClickEnabled = GUILayout.Toggle(myScript.doubleClickEnabled, "双击");if (myScript.doubleClickEnabled){myScript.doubleClickTime = EditorGUILayout.FloatField("双击时间", myScript.doubleClickTime);}myScript.longPressEnabled = GUILayout.Toggle(myScript.longPressEnabled, "长按");if (myScript.longPressEnabled){myScript.minPressTime = EditorGUILayout.FloatField("最小按住时间", myScript.minPressTime);}base.OnInspectorGUI();}
}public class ButtonExtension : Button
{#region 单机双击相关[SerializeField]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
}

参考博客:Unity 编辑器-UGUI拓展Button,一个和原Button一样按钮⭐_unity editor button-CSDN博客

[Unity案例]Button的双击和长按_unity button 长按检测-CSDN博客

相关文章:

Unity的Button组件进行扩展

废话不多说&#xff0c;在Untiy中&#xff0c;如果想要对Button等组件进行扩展的话&#xff0c;那么不仅仅只需要将新增的属性设置为public或者增加SerializeField字段就行了的&#xff0c;同时需要对Inspector的GUI面板进行修改&#xff0c;以下直接展示代码&#xff1a; usi…...

前端vue-插值表达式和v-html的区别

创建vue实例的时候&#xff0c;可以有两种形式。 1.let appnew Vue({}) 2 const appnew Vue({}) 3 el是挂载点&#xff0c;是上面div的id值 4 data中的值可以展示在上面div中 5 v-html标签里面如果有内容&#xff0c;则我们的新内容会把标签里面的内容覆盖掉...

【开发心得】筑梦上海:项目风云录(4)

不知不觉已经写到了第4篇&#xff0c;天下大事&#xff0c;必作于细。 其实项目管理也是如此&#xff0c;成功都在细节之处。自从博士离开以后&#xff0c;项目逐步开始进入了正常轨道。来来回回的30多人&#xff0c;也不能一一列举的记流水账。 目录 会海和MSN 小娇往事 …...

el-table使用el-switch选择器没效果

出现问题的代码: 0表示启用&#xff0c;1表示禁用&#xff0c;发现页面根本没有效果&#xff0c;百思不得其解&#xff0c;查阅资料&#xff0c;恍然大悟。 <el-table :data"userList" stripe border style"width: 100%" height"500"><…...

libserailport交叉编译适配说明

1&#xff1a;libserialport简介 github路径 自己的gitee路径 libserialport 是一个跨平台的串口通信库&#xff0c;由 sigrok 项目开发。它简洁、易用&#xff0c;并且支持多种操作系统。 libserialport 支持阻塞和非阻塞模式&#xff0c;可以根据你的需求选择适当的模式。阻…...

C语言中的一些小知识(二)

一、"%"运算符两侧只能是整数 在C语言中&#xff0c;% 运算符称为模运算符或取余运算符&#xff0c;它用于计算两个整数相除后的余数。当使用 % 运算符时&#xff0c;操作数必须是整数类型&#xff08;包括 char、int、long 等&#xff09;。 语法 remainder div…...

使用 Go 语言实现简单聊天系统

在互联网时代&#xff0c;聊天系统是常见的应用场景之一。无论是即时通讯、在线客服还是多人游戏中的消息系统&#xff0c;聊天功能的实现都是必不可少的。本文将使用 Go 语言&#xff0c;结合 WebSocket 来构建一个简单的多人聊天室系统。 一、项目结构 首先&#xff0c;我们…...

用友U8二次开发工具KK-FULL-*****-EFWeb使用方法

1、安装: 下一步&#xff0c;下一步即可。弹出黑框不要关闭&#xff0c;让其自动执行并关闭。 2、服务配置&#xff1a; 输入服务器IP地址&#xff0c;选择U8数据源&#xff0c;输入U8用户名及账号&#xff0c;U8登录日期勾选系统日期。测试参数有效性&#xff0c;提示测试通过…...

【经验帖】脏读和不可重复读的概念及影响

脏读和不可重复读是数据库事务并发执行时可能出现的两种数据一致性问题&#xff0c;它们对数据的一致性和完整性有着显著的影响。以下是脏读和不可重复读的具体影响&#xff1a; 脏读的影响 脏读发生在一个事务读取了另一个事务未提交的数据时。由于这些数据尚未被提交&#x…...

MTK zephyr平台:USB升级、枚举流程

一、USB升级流程 通过代码及log分析,当前平台升级过程在PL阶段进行 USB download相关代码 mtk/modules/hal/boot/preloader/platform/flashc/ mtk/modules/hal/boot/preloader/platform/board_name/flash/ mtk/modules/hal/boot/preloader/platform/board_name/src/drive…...

golang操作mysql利器-gorm

1、傻瓜示例 GORM通过将数据库表中的数据映射到面向对象的模型中&#xff0c;简化了数据库操作&#xff0c;使得开发者可以很方便的使用代码来操作数据库&#xff0c;而无需编写SQL语句。 目前有个mysql表&#xff1a;miniprogram_orders&#xff0c;其存储了所有用户对应的订…...

09 Shell Scriptfor循环结构语句

Shell Scriptfor循环结构语句 一、Shell FOR循环语句概述 ​ 属于shell的符合语句 ​ 可以看出帮助信息给出了两种语法 [rootlocalhost ~]# help for for: for NAME [in WORDS ... ] ; do COMMANDS; doneExecute commands for each member in a list.The for loop executes…...

【Java】并发集合

并发集合&#xff08;java.util.concurrent&#xff09; 一、List CopyOnWriteArrayList&#xff08;ReentrantLock实现线程安全&#xff09; &#xff08;1&#xff09;并发修改&#xff08;写操作&#xff09;时保证线程安全&#xff1a; 通过ReentrantLock实现多个线程并…...

活动邀请|景联文科技与您相约华为全联接大会2024

2024年9月19-21日&#xff0c;第九届华为全联接大会(简称&#xff1a;HUAWEICONNECT2024)将在上海世博展览馆和上海世博中心举办。 作为华为的旗舰盛会&#xff0c;本次大会以“共赢行业智能化”为主题将邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁&#xf…...

周边游|基于springBoot的周边游平台设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任…...

【编程基础知识】mysql是怎样执行一条sql语句的,涉及到哪些环节步骤是,mysql的整体体系结构是啥样的,有哪些组件

一、步骤 MySQL执行一条SQL语句的过程涉及多个环节和步骤。以下是这一过程的概述&#xff1a; 客户端连接&#xff1a;客户端通过连接器&#xff08;Connector&#xff09;向MySQL服务器发起连接请求。身份验证&#xff1a;连接器对用户身份进行验证&#xff0c;确保用户有权…...

如何上传tauri项目到csdn gitcode

如何上传tauri项目到csdn gitcode 首先保证项目目录有.gitignore&#xff0c;避免不必要的文件上传分享。 gitignore文件 # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log*node_modules dist dist-ssr *.local# Editor …...

【速成Redis】02 Redis 五大基本数据类型常用命令

前言&#xff1a; 上一节课&#xff0c;我们对redis进行了初步了解&#xff0c;和安装好了redis。【速成Redis】01 Redis简介及windows上如何安装redishttps://blog.csdn.net/weixin_71246590/article/details/142319358?spm1001.2014.3001.5501 该篇博客&#xff0c;我们正…...

UnLua扩展C++函数和蓝图自定义事件

一、通过BlueprintImplementableEvent标记扩展C函数 1、 这个标记表示C不需要实现&#xff0c;让蓝图/Lua重写。 2、首先在C中将LuaImp函数标记为BlueprintImplementableEvent&#xff0c;不需要实现&#xff0c;然后再GetIndex中调用该函数。 MyBaseActor.h UFUNCTION(Bluepr…...

干耳屎硬掏不出来怎么办?质量最好的可视挖耳勺推荐

很多干耳的小伙伴都会用普通耳勺来掏耳朵。由于普通耳勺由于其盲操作的特性&#xff0c;对于耳道非直线结构的清理存在诸多不便。所以市面上出现了可视挖耳勺&#xff0c;让我们清晰的看到自己耳道&#xff0c;更加安全的清洁耳朵。&#xff0c;可视挖耳勺这款产品在市场上越来…...

18.children 这个 props 的意义何在?该怎样正确使用?

在 React 里&#xff0c;children 是一个非常特殊、非常常用的 prop&#xff0c; 它专门用来接收&#xff1a;写在组件标签中间的那一部分内容。你可以把它理解为&#xff1a;组件外层负责搭“外壳”&#xff0c;children 负责装进这个壳里的“内容物”。一、children 到底是什…...

ILI9163C SPI TFT驱动库深度解析与嵌入式优化实践

1. TFT_ILI9163C 驱动库深度解析&#xff1a;面向嵌入式系统的高性能SPI TFT显示方案1.1 项目定位与工程价值TFT_ILI9163C 是一款专为嵌入式平台优化的高性能 SPI TFT 显示驱动库&#xff0c;核心目标是在资源受限的微控制器上实现接近硬件极限的图形刷新吞吐量。其设计哲学并非…...

simia_joystick:面向心理生理实验的低延迟摇杆驱动设计

1. simia_joystick 组件深度解析&#xff1a;面向嵌入式心理生理交互系统的摇杆驱动设计1.1 组件定位与工程目标simia_joystick是专为simia embedded嵌入式平台设计的摇杆&#xff08;Joystick&#xff09;输入组件&#xff0c;其核心使命并非通用HID设备模拟&#xff0c;而是服…...

OpenClaw v2026.3.31 深度解读:为什么这次更新不是“小修小补”,而是一次明显的安全收口与后台任务体系成形

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

大学生食品安全科普网页——web网页期末大作业

&#xff08;文件先保存到自己网盘&#xff0c;谨防文件丢失&#xff01;&#xff01;&#xff09; 源码获取地址 链接: https://pan.baidu.com/s/1r6C8_J31D01e1uG3FJi27w?pwdzxxh提取码: zxxhhtml科普网页源码 ✅ 网页一共6个页面 ✅ 网页使用html css js完成 布局简单 ✅…...

从销售预测到异常检测:时间序列分解在业务中的5个高能应用场景

时间序列分解&#xff1a;驱动业务决策的5个实战场景解析 当电商平台的库存经理面对双十一前暴涨的销售曲线时&#xff0c;当数据中心运维工程师盯着突然飙升的服务器指标时&#xff0c;他们需要的不是数学公式的推导&#xff0c;而是能直接指导行动的时序洞察。时间序列分解技…...

深入理解 Firebase onSnapshot 的监听机制

前言 在现代 Web 应用开发中,Firebase Firestore 提供了强大的实时数据库功能,onSnapshot 监听器是其中一个关键特性。然而,如何正确地使用这个监听器来处理网络连接失败等特殊情况,往往是开发者需要深入理解的。今天我们将探讨 onSnapshot 的工作机制,并通过实例展示如何…...

Transformer双模态新玩法:CodeBERT如何同时理解代码和自然语言?

Transformer双模态新玩法&#xff1a;CodeBERT如何同时理解代码和自然语言&#xff1f; 在AI领域&#xff0c;让机器同时理解编程语言和自然语言一直是个令人着迷的挑战。想象一下&#xff0c;一个模型既能读懂Python代码的逻辑结构&#xff0c;又能理解开发者用英语写的注释文…...

OpenGL天空盒实战:从零搭建到环境反射效果(附完整代码)

OpenGL天空盒实战&#xff1a;从零搭建到环境反射效果&#xff08;附完整代码&#xff09; 在3D图形开发中&#xff0c;天空盒技术是实现环境氛围营造的基础手段。想象一下&#xff0c;当你站在游戏场景中抬头望去&#xff0c;远处的山脉、流动的云层和深邃的星空共同构成了沉浸…...

GIS数据处理避坑指南:如何一键批量转换KMZ/KML并保留所有字段(附工具下载)

GIS数据处理实战&#xff1a;KMZ/KML批量转换与属性保留全流程解析 在GIS数据处理工作中&#xff0c;KMZ和KML格式的批量转换是一个高频需求&#xff0c;但许多用户在实际操作中常遇到属性丢失、坐标系错乱等问题。我曾在一个城市交通规划项目中&#xff0c;因为转换后的属性字…...