【Unity】 HTFramework框架(五十九)快速开发编辑器工具(Assembly Viewer + ILSpy)
更新日期:2025年1月23日。
Github源码:[点我获取源码]
Gitee源码:[点我获取源码]
索引
- 开发编辑器工具
- MouseRayTarget焦点视角
- Collider线框
- Assembly Viewer搜索程序集
- ILSpy反编译程序集
- 搜索GizmosElement类
- 找到Gizmos菜单
- 找到Gizmos窗口
- 分析AnnotationWindow类
- 开始编写工具
开发编辑器工具
本章我将借助Assembly Viewer工具和ILSpy工具,依靠反射开发一个Unity编辑器工具,此为快速开发编辑器工具的一个示例。
此工具的用途:一键隐藏/显示脚本的Gizmos控件,还Scene视图一个干净清爽。
MouseRayTarget焦点视角
最新的MouseRayTarget组件新增了参数Look At Angle,用于在自由视角模式下,摄像机焦点到此物体时所进入的视角参数:

该参数同时会借助Gizmos控件功能,在Scene视图模拟显示摄像机注视他时,可能处于的位置:

如果选中的物体多了(或者选中了根物体),这些Gizmos控件就有点混乱了:

Collider线框
而且,MouseRayTarget组件一般为了配合鼠标点击,都会同时挂载碰撞器Collider组件,Collider组件的线框也是干扰画面的最大元凶之一(在一些大场景里面尤其明显):

虽然我们可以在Scene视图右上方的Gizmos菜单里面找到并隐藏任意组件、脚本的Gizmos,但这个过程略显繁琐:

我们所想的,是在需要时一键显示Gizmos,不需要时一键隐藏Gizmos,显示与隐藏的切换越快捷、简便越好。
为此,我们准备此编辑器工具的开发。
Assembly Viewer搜索程序集
为了显示和隐藏Gizmos,我们不可能自行开发此功能,所以只能借助上图位于Scene视图的Gizmos菜单。
打开Assembly Viewer程序集搜索工具:

Gizmos菜单作为一个编辑器窗口,其必定位于UnityEditor程序集中,所以我们直接在UnityEditor程序集中搜索关键字Gizmos:

经过一番搜索,最终在UnityEditor.SceneViewModule中搜到了一个可疑目标:

SceneView顾名思义即为Scene视图,且这个GizmosElement类继承至EditorToolbarDropdownToggle,从名字上看很像是编辑器工具栏下拉菜单,OK了,我们的切入点就选他了。
接下来我们点击Open in ILSpy按钮,在ILSpy中反编译这个程序集:

ILSpy反编译程序集
搜索GizmosElement类
反编译成功后,我们首先搜索切入点GizmosElement类:

找到Gizmos菜单
反编译该类后,查看源码,第一眼就找到了我们想要的东西:

此工具栏提示,正好与编辑器中的对应,说明这个类正是Gizmos菜单:

找到Gizmos窗口
点击Gizmos菜单会打开Gizmos窗口,所以我们看菜单的点击事件:

很明显,这句话便是打开Gizmos窗口:
AnnotationWindow.ShowAtPosition(base.worldBound, false);
AnnotationWindow便是我们要找的Gizmos窗口。
分析AnnotationWindow类
通过分析AnnotationWindow类,我们知道了一个GizmoInfo对象,即对应了一个组件、脚本的Gizmos状态。
其中的如下2个GizmoInfo集合,正对应了AnnotationWindow窗口中的组件(Builtin)和脚本(Script):



再进一步分析,其中的SetGizmoState方法,即可设置一个GizmoInfo对象的开启状态,也即是Gizmos控件的开启状态:

开始编写工具
万事俱备只欠东风,接下来就是编码环节,熟悉反射的同学脑海中可能已经构建了一套完整的伪代码,事实上反射的代码也极其简单,所以我们就直接贴出源码了:
protected void ShowOrHideGizmos(string className, bool isBuiltin){//反射出AnnotationWindow类Type type = Type.GetType("UnityEditor.AnnotationWindow,UnityEditor");//根据是否为内置组件,反射出对应的GizmoInfo集合FieldInfo annotations = type.GetField(isBuiltin ? "m_BuiltinAnnotations" : "m_ScriptAnnotations", BindingFlags.Instance | BindingFlags.NonPublic);//反射出打开AnnotationWindow窗口的方法MethodInfo showAtPosition = type.GetMethod("ShowAtPosition", BindingFlags.Static | BindingFlags.NonPublic);//反射出设置Gizmos状态的方法MethodInfo setGizmoState = type.GetMethod("SetGizmoState", BindingFlags.Instance | BindingFlags.NonPublic);//第一步:先打开AnnotationWindow窗口(显示位置无所谓,我们立即会关闭他)showAtPosition.Invoke(null, new object[] { Rect.zero, false });EditorWindow window = EditorWindow.GetWindow(type);//第二步:反射出GizmoInfo集合的真实对象List<GizmoInfo> gizmoInfos = annotations.GetValue(window) as List<GizmoInfo>;//第三步:找到我们需要设置Gizmos状态的类的GizmoInfo对象GizmoInfo gizmoInfo = gizmoInfos.Find((g) => { return g.name == className; });//第三步:改变Gizmos激活状态(显示变隐藏,隐藏变显示)gizmoInfo.gizmoEnabled = !gizmoInfo.gizmoEnabled;//第四步:调用设置Gizmos状态的方法setGizmoState.Invoke(window, new object[] { gizmoInfo, true });//第五步:关闭窗口window.Close();}
如上方法我们将其放到MouseRayTargetBase类中,然后在检视面板写一个按钮调用他即可:
[Button("Show/Hide This Gizmos", ButtonAttribute.EnableMode.Always)]protected void ShowOrHideThisGizmos(){ShowOrHideGizmos(GetType().Name, false);}
同时,控制Collider组件的线框显示也丢在这里:
[Button("Show/Hide Collider Gizmos", ButtonAttribute.EnableMode.Always)]protected void ShowOrHideColliderGizmos(){Collider collider = GetComponent<Collider>();if (collider){ShowOrHideGizmos(collider.GetType().Name, true);}}
最后我们来看看效果:

相关文章:
【Unity】 HTFramework框架(五十九)快速开发编辑器工具(Assembly Viewer + ILSpy)
更新日期:2025年1月23日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 开发编辑器工具MouseRayTarget焦点视角Collider线框Assembly Viewer搜索程序集ILSpy反编译程序集搜索GizmosElement类找到Gizmos菜单找到Gizmos窗口分析A…...
如何解决TikTok网络不稳定的问题
TikTok是目前全球最受欢迎的短视频平台之一,凭借其丰富多彩的内容和社交功能吸引了数以亿计的用户。然而,尽管TikTok在世界范围内的使用情况不断增长,但不少用户在使用过程中仍然会遇到网络不稳定的问题。无论是在观看视频时遇到缓冲…...
告别页面刷新!如何使用AJAX和FormData优化Web表单提交
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
WireShark4.4.2浏览器网络调试指南:数据统计(八)
概述 Wireshark 是一款功能强大的开源网络协议分析软件,被广泛应用于网络调试和数据分析。随着互联网的发展,以及网络安全问题日益严峻,了解如何使用 Wireshark进行浏览器网络调试显得尤为重要。最新的 Wireshark4.4.2 提供了更加强大的功能…...
Hypium+python鸿蒙原生自动化安装配置
Hypiumpython自动化搭建 文章目录 Python安装pip源配置HDC安装Hypium安装DevEco Testing Hypium插件安装及使用方法插件安装工程创建区域 Python安装 推荐从官网获取3.10版本,其他版本可能出现兼容性问题 Python下载地址 下载64/32bitwindows安装文件&am…...
2025创业思路和方向有哪些?
创业思路和方向是决定创业成功与否的关键因素。以下是一些基于找到的参考内容的创业思路和方向,旨在激发创业灵感: 一、技术创新与融合: 1、智能手机与云电视结合:开发集成智能手机功能的云电视,提供通讯、娱乐一体化体…...
实验五---控制系统的稳定性分析---自动控制原理实验课
一 实验目的 1、理解控制系统稳定性的概念 2、掌握多种判定系统稳定性的原理及方法 3、掌握使用Matlab软件进行控制系统的稳定性分析 二 实验仪器 计算机,MATLAB仿真软件 三 实验内容及步骤 1.计算系统闭环特征根,判别系统稳定性; 2.绘制系统…...
AttributeError: can‘t set attribute ‘lines‘
报错: ax p3.Axes3D(fig) ax.lines [] AttributeError: cant set attribute lines 总结下来,解决方案应包括: 1. 使用ax.clear()方法清除所有内容。 2. 逐个移除lines中的元素。 3. 检查matplotlib版本,确保没有已知的bug。…...
Day07:缓存-数据淘汰策略
Redis的数据淘汰策略有哪些 ? (key过期导致的) 在redis中提供了两种数据过期删除策略 第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期&…...
基于聚类与相关性分析对马来西亚房价数据进行分析
碎碎念:由于最近太忙了,更新的比较慢,提前祝大家新春快乐,万事如意!本数据集的下载地址,读者可以自行下载。 1.项目背景 本项目旨在对马来西亚房地产市场进行初步的数据分析,探索各州的房产市…...
Java—工具类类使用
工具类的调用:工具类名.方法名 工具类的书写: 示例: 写一个遍历数组的工具类 import java.util.Arrays;public class ArrayUtil {private ArrayUtil() {} //用私有化构造方法不让外界创建关于它的对象//定义static静态方法,因…...
游戏开发领域 - 游戏引擎 UE 与 Unity
游戏引擎 游戏引擎是用于开发电子游戏的软件框架,它提供图形渲染、物理模拟、音频处理、动画系统、脚本编写等功能,帮助开发者高效创建电子游戏 但是,游戏引擎也不仅限于游戏开发,还广泛应用于其他领域,例如ÿ…...
[NVME] PMRCAP-Persistent Memory Region Capabilities
This register indicates capabilities of the Persistent Memory Region(持久内存区域) If the controller does not support the Persistent Memory Region feature, then this register shall be cleared to 0h BitsTypeResetDescription31:25RO 0hReserved24ROImpl Spec…...
Ollama windows安装
Ollama 是一个开源项目,专注于帮助用户本地化运行大型语言模型(LLMs)。它提供了一个简单易用的框架,让开发者和个人用户能够在自己的设备上部署和运行 LLMs,而无需依赖云服务或外部 API。这对于需要数据隐私、离线使用…...
vim操作简要记录
操作容易忘记,记录一下基本使用的 :wq保存退出 :w :q :q! :wq! i I a A 方向键 h左 j下 k上 l右 dd删除方行(这其实是剪切行操作,不过一般用作删除,长按可删除,不过按.执行上一次操作删除更快) .执行上…...
车载软件架构 --- 基于AUTOSAR软件架构的ECU开发流程小白篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
汇编基础语法及其示例
1.汇编指令 1.1汇编指令的基本格式 <opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand> <功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数> 注:第一操作寄存器…...
android获取EditText内容,TextWatcher按条件触发
android获取EditText内容,TextWatcher按条件触发 背景:解决方案:效果: 背景: 最近在尝试用原生安卓实现仿element-ui表单校验功能,其中涉及到EditText组件内容的动态校验,初步实现功能后&#…...
Blazor-Blazor Web App项目结构
让我们还是从创建项目开始,来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式,有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…...
【线上问题定位处理】及【性能优化】系列文章
目录 性能优化 性能优化 九大服务架构性能优化方式 如何进行GC调优 如何排查线上系统出现的Full GC MySQL - 性能优化 MySQL - 分库分表 大数据查询的处理方案 MySQL优化手段有哪些 服务CPU100%问题如何快速定位? 服务内存OOM问题如何快速定位? JVM调优6大步骤 线…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
