【Unity编辑器扩展】编辑器代码一键添加按钮响应事件

news2024/11/24 16:07:28

此功能能是基于UI变量代码生成工具的改良扩展:【Unity编辑器扩展】UI变量代码自动生成工具(编辑器扩展干货/大幅提高效率)_ui代码自动生成_TopGames的博客-CSDN博客

工具效果预览:

 UGUI的Button按钮在编辑面板添加响应事件非常繁琐,需要拖个节点,然后设置指定脚本类的方法,如下图:

 工具功能和使用方法:

1. 打开UI界面预制体;

2. 选择Button节点(支持多选),右键菜单->UIForm Fields Tool-> Add Button Event添加事件,并自动按钮节点名为Button的标识ID;

代码实现:

Button组件的onClick事件其实分了两种,Persistent和NonPersistent,Persistent是持久保存的,也就是在编辑器界面添加的。NonPersistent是代码运行时添加的。两种事件存在两个独立的事件列表,两者独立存在。

 为代码添加Persistent事件,需要用到UnityEditor.Events.UnityEventTools:

UnityEventTools.RemovePersistentListener:移除持久化按钮事件

UnityEditor.Events.UnityEventTools.AddPersistentListener: 添加持久化按钮事件

并且支持添加带有各种类型参数的按钮事件:

1. UnityEditor.Events.UnityEventTools.AddBoolPersistentListener

2. UnityEditor.Events.UnityEventTools.AddFloatPersistentListener

3. UnityEditor.Events.UnityEventTools.AddIntPersistentListener

4. UnityEditor.Events.UnityEventTools.AddObjectPersistentListener

5. UnityEditor.Events.UnityEventTools.AddStringPersistentListener

以添加带有字符串参数的按钮事件为例:

 1. 参数UnityEventBase unityEvent; 指的是按钮存储事件的变量。变量名为m_OnClick,这个变量是私有的,需要通过反射拿到:

var buttonCom = item.GetComponent<Button>();
var m_OnClick = buttonCom.GetType().GetField("m_OnClick", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(buttonCom) as UnityEvent;

2. 参数UnityAction<string> call,即按钮回调事件。这个事件是绑定的脚本类中的方法,因此创建时需指定Target和Method:

var btnEvent = UnityEngine.Events.UnityAction.CreateDelegate(typeof(UnityAction<string>), uiFormLogic, "YourButtonCallbackFunctionName") as UnityAction<string>;

为了避免重复添加事件,添加事件前可以清空当前持久化存储事件:

for (int i = m_OnClick.GetPersistentEventCount() - 1; i >= 0; i--)
                {
                    UnityEventTools.RemovePersistentListener(m_OnClick, i);
                }

完整代码:

[MenuItem("GameObject/UIForm Fields Tool/Add Button OnClick Event", false, priority = 1101)]
        private static void AddClickButtonEvent()
        {
            if (Selection.count <= 0) return;

            var uiForm = GetPrefabRootComponent<UIFormBase>();
            if (uiForm == null)
            {
                Debug.LogWarning("UIForm Script is not exist.");
                return;
            }
            bool hasChanged = false;
            foreach (var item in Selection.gameObjects)
            {
                var buttonCom = item?.GetComponent<Button>();
                
                if (buttonCom == null) continue;

                var m_OnClick = buttonCom.GetType().GetField("m_OnClick", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(buttonCom) as UnityEvent;
                var btnEvent = UnityEngine.Events.UnityAction.CreateDelegate(typeof(UnityAction<string>), uiForm, KEY_BUTTON_ONCLICK) as UnityAction<string>;
                for (int i = m_OnClick.GetPersistentEventCount() - 1; i >= 0; i--)
                {
                    UnityEventTools.RemovePersistentListener(m_OnClick, i);
                }
                UnityEditor.Events.UnityEventTools.AddStringPersistentListener(m_OnClick, btnEvent, buttonCom.name);
                hasChanged = true;
            }
            if (hasChanged) EditorUtility.SetDirty(uiForm);
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频孪生在数字经济产业发展中所发挥的作用

2023年中共中央、国务院印发的《数字中国建设整体布局规划》中明确提出&#xff1a;培育壮大数字经济核心产业&#xff0c;研究制定推动数字产业高质量发展的措施&#xff0c;打造具有国际竞争力的数字产业集群。 推动数字技术和实体经济深度融合&#xff0c;在农业、工业、金…

七大排序算法——堆排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、堆排序核心思想代码实现 三、性能分析四、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递…

emacs下vercial-border审美观记录

昨天一晚上时间都花在了emacs的vercial-border上。 一开始还不知道这个名词&#xff0c;以为是treemacs展示的效果&#xff0c;毕竟我是在打开treemacs的时候&#xff0c;才发现这个分割线太丑了,我的审美观在蠢蠢欲动了。 谁说程序员没有审美观的&#xff1f;只是前面有别的东…

一文带你快速设计精美可视化大屏

一文带你快速设计精美可视化大屏 文章目录 一文带你快速设计精美可视化大屏&#x1f468;‍&#x1f3eb;前言&#xff1a;什么是可视化大屏&#x1f468;‍&#x1f52c;内容1&#xff1a;可视化大屏设计原则和设计考虑&#x1f468;‍⚖️内容2&#xff1a;可视化大屏设计流程…

第四章 数学知识(三)——高斯消元,组合

文章目录 高斯消元组合数1 < b < a < 20001 < b < a < 1000001 < b < a < 1 0 18 10^{18} 1018高精度组合数卡特兰数 高斯消元练习题884. 高斯消元解异或线性方程组 组合数练习题885. 求组合数 I886. 求组合数 II887. 求组合数 III888. 求组合数 I…

【AUTOSAR】:NvM

Autosar的NvM理解 AUTOSAR_SWS_NVRAMManager.pdf块的定义块的管理类型块的状态重点梳理:几个常用的API函数AUTOSAR_SWS_MemoryAbstractionInterface.pdf里面对存储的HAL抽象衍生出几个重要的MainFunctionNV (non volatile):非亦失性,也就是我们需要将数据存储到Flash或外部E…

谈谈企业未来如何实现有序用电

摘 要&#xff1a;风光发电的大比例发展将对电网需要的转动惯量和备用产生致命影响&#xff0c;严重威胁电网的平稳运行&#xff0c;本文结合AcrelEMS企业微电网系统谈谈企业如何应对。 关键词&#xff1a;有序用电 调节负荷 综合能源管理 企业微电网 0 引言 自2020年9月以来&…

android linker加载和链接机制

文章目录 So的加载和启动So文件的读取与加载工作ReadProgramHeaderReserveAddressSpaceLoadSegmentsFindPhdr so 的链接机制动态节区 执行so文件原文地址&#xff1a; So的加载和启动 handledlopen(pathName,PTLD_LAZY)&#xff1b;//获得指定文件的句柄&#xff0c;这个handl…

SpringAMQP - 消息传输时,如何提高性能?解决 SQL 注入问题?

目录 一、问题背景 二、从消息转化器根源解决问题 1.引入依赖 2.在服务生产者和消费者中都重新定义一个 MessageConverter&#xff0c;注入到 Spring 容器中 一、问题背景 在SpringAMQP的发送方法中&#xff0c;接收消息的类型是Object&#xff0c;也就是说我们可以发送任意…

【程序人生】如何在工作中保持稳定的情绪?

前言 在工作中保持稳定的情绪是现代生活中一个备受关注的话题。随着职场压力和工作挑战的增加&#xff0c;我们常常发现自己情绪波动不定&#xff0c;甚至受到负面情绪的困扰。然而&#xff0c;保持稳定的情绪对于我们的工作效率、人际关系和整体幸福感都至关重要。 无论你是…

GPT-4揭秘:从科学突破到宇宙探索,大模型如何为人类谋福祉?

最近一段时间&#xff0c;人工智能领域似乎在上演一场密切相关的三幕戏。从OpenAI的GPT-4&#xff0c;到LeanDojo的开源平台&#xff0c;再到Elon Musk的xAI&#xff0c;人工智能的最新发展进程仿佛正在向我们揭示未来的模样。让我们深入探讨一下这些最新的科技发展。 GPT-4&a…

个人信息保护影响评估,推动个人信息保护“关口前移”

2021 年 11 月 1 日&#xff0c;《个人信息保护法》&#xff08;以下简称《个保法》&#xff09;的正式施行&#xff0c;可以说在我国个人信息保护法治建设具有里程碑意义。《个保法》内容具备系统性、针对性和可操作性特点&#xff0c;规范了个人信息处理活动&#xff0c;明确…

ubuntu安装软件包提示【未安装软件包 deepin-elf-verify】【已解决】

文章目录 背景原因分析步骤1 解压文件2 删除依赖3 重新打包软件 转载请标明出处&#xff1a; https://bigmaning.blog.csdn.net/article/details/131713280 本文出自:【BigManing的博客】 背景 在ubuntu系统上安装一个deb文件&#xff0c;执行命令后&#xff0c;报错如下 sud…

【C++】STL之string功能及模拟实现

目录 前沿 一、标准库中的string类 二、string类的常用接口说明 1、string类对象的常见构造 2、string类对象的容量操作 3、string类对象的访问及遍历操作 4、string类对象的修改操作 5、string类非成员函数 6、vs下string结构的说明 三、string类的模拟实现 1、构造函数 2…

MySQL(备份还原索引视图入门)

文章目录 第一节 备份和还原1、题目2、题目作答 第二节 索引1.题目2.题目作答 第三节 视图1 题目2 题目作答 第一节 备份和还原 1、题目 CREATE DATABASE beifen;use beifen;CREATE TABLE books(bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEA…

django框架向DRF框架演变过程详解

一、Django框架实现项目查询接口 主要知识点&#xff1a; Django框架视图函数 1、在 Django 项目中创建一个应用&#xff08;如果还没有创建&#xff09;&#xff1a; python manage.py startapp projects 2、在项目的 models.py 文件中定义项目模型 from django.db impor…

视频融合平台EasyCVR登录后通道数据及菜单栏页面显示异常的排查与解决

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。 有用…

只需三步实现Gateway结合Sentinel实现无侵入网关限流,注意避坑!

前言&#xff1a;本文基于您已有基础的可运行的微服务系统&#xff0c;使用了Sping Cloud Alibaba&#xff0c;Gateway,Nacos等&#xff1b;目标实现网关流控类型的限流。 顾名思义限流用于在高并发场景下限制请求流量的进入&#xff0c;保护系统不被冲垮。阿里巴巴的开源senti…

数据库慢查询优化

数据库慢查询优化 1.分析慢查询原因 分析导致慢查询的原因是数据库性能优化的关键步骤之一。下面是一些常见的方法和工具&#xff0c;可以帮助你确定慢查询的原因&#xff1a; 慢查询日志&#xff1a; 开启慢查询日志&#xff0c;允许数据库记录执行时间超过阈值的查询语句。…

百度ERNIE 3.0——中文情感分析实战

目录 前言一、百度ERNIE 3.0二、使用ERNIE 3.0中文预训练模型进行句子级别的情感分析2-1、环境2-2、数据集加载2-3、加载预训练模型和分词器2-4、基于预训练模型的数据处理2-5、数据训练和评估2-6、模型验证2-7、情感分析结果的预测以及保存 三、自定义个人案例3-1、如何自定义…