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

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

更新日期&#xff1a;2025年1月23日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 开发编辑器工具MouseRayTarget焦点视角Collider线框Assembly Viewer搜索程序集ILSpy反编译程序集搜索GizmosElement类找到Gizmos菜单找到Gizmos窗口分析A…...

如何解决TikTok网络不稳定的问题

TikTok是目前全球最受欢迎的短视频平台之一&#xff0c;凭借其丰富多彩的内容和社交功能吸引了数以亿计的用户。然而&#xff0c;尽管TikTok在世界范围内的使用情况不断增长&#xff0c;但不少用户在使用过程中仍然会遇到网络不稳定的问题。无论是在观看视频时遇到缓冲&#xf…...

告别页面刷新!如何使用AJAX和FormData优化Web表单提交

系列文章目录 01-从零开始学 HTML&#xff1a;构建网页的基本框架与技巧 02-HTML常见文本标签解析&#xff1a;从基础到进阶的全面指南 03-HTML从入门到精通&#xff1a;链接与图像标签全解析 04-HTML 列表标签全解析&#xff1a;无序与有序列表的深度应用 05-HTML表格标签全面…...

WireShark4.4.2浏览器网络调试指南:数据统计(八)

概述 Wireshark 是一款功能强大的开源网络协议分析软件&#xff0c;被广泛应用于网络调试和数据分析。随着互联网的发展&#xff0c;以及网络安全问题日益严峻&#xff0c;了解如何使用 Wireshark进行浏览器网络调试显得尤为重要。最新的 Wireshark4.4.2 提供了更加强大的功能…...

Hypium+python鸿蒙原生自动化安装配置

Hypiumpython自动化搭建 文章目录 Python安装pip源配置HDC安装Hypium安装DevEco Testing Hypium插件安装及使用方法​​​​​插件安装工程创建区域 Python安装 推荐从官网获取3.10版本&#xff0c;其他版本可能出现兼容性问题 Python下载地址 下载64/32bitwindows安装文件&am…...

2025创业思路和方向有哪些?

创业思路和方向是决定创业成功与否的关键因素。以下是一些基于找到的参考内容的创业思路和方向&#xff0c;旨在激发创业灵感&#xff1a; 一、技术创新与融合&#xff1a; 1、智能手机与云电视结合&#xff1a;开发集成智能手机功能的云电视&#xff0c;提供通讯、娱乐一体化体…...

实验五---控制系统的稳定性分析---自动控制原理实验课

一 实验目的 1、理解控制系统稳定性的概念 2、掌握多种判定系统稳定性的原理及方法 3、掌握使用Matlab软件进行控制系统的稳定性分析 二 实验仪器 计算机&#xff0c;MATLAB仿真软件 三 实验内容及步骤 1.计算系统闭环特征根&#xff0c;判别系统稳定性&#xff1b; 2.绘制系统…...

AttributeError: can‘t set attribute ‘lines‘

报错&#xff1a; ax p3.Axes3D(fig) ax.lines [] AttributeError: cant set attribute lines 总结下来&#xff0c;解决方案应包括&#xff1a; 1. 使用ax.clear()方法清除所有内容。 2. 逐个移除lines中的元素。 3. 检查matplotlib版本&#xff0c;确保没有已知的bug。…...

Day07:缓存-数据淘汰策略

Redis的数据淘汰策略有哪些 ? &#xff08;key过期导致的&#xff09; 在redis中提供了两种数据过期删除策略 第一种是惰性删除&#xff0c;在设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们再检查其是否过期&#xff0c;如果过期&…...

基于聚类与相关性分析对马来西亚房价数据进行分析

碎碎念&#xff1a;由于最近太忙了&#xff0c;更新的比较慢&#xff0c;提前祝大家新春快乐&#xff0c;万事如意&#xff01;本数据集的下载地址&#xff0c;读者可以自行下载。 1.项目背景 本项目旨在对马来西亚房地产市场进行初步的数据分析&#xff0c;探索各州的房产市…...

Java—工具类类使用

工具类的调用&#xff1a;工具类名.方法名 工具类的书写&#xff1a; 示例&#xff1a; 写一个遍历数组的工具类 import java.util.Arrays;public class ArrayUtil {private ArrayUtil() {} //用私有化构造方法不让外界创建关于它的对象//定义static静态方法&#xff0c;因…...

游戏开发领域 - 游戏引擎 UE 与 Unity

游戏引擎 游戏引擎是用于开发电子游戏的软件框架&#xff0c;它提供图形渲染、物理模拟、音频处理、动画系统、脚本编写等功能&#xff0c;帮助开发者高效创建电子游戏 但是&#xff0c;游戏引擎也不仅限于游戏开发&#xff0c;还广泛应用于其他领域&#xff0c;例如&#xff…...

[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 是一个开源项目&#xff0c;专注于帮助用户本地化运行大型语言模型&#xff08;LLMs&#xff09;。它提供了一个简单易用的框架&#xff0c;让开发者和个人用户能够在自己的设备上部署和运行 LLMs&#xff0c;而无需依赖云服务或外部 API。这对于需要数据隐私、离线使用…...

vim操作简要记录

操作容易忘记&#xff0c;记录一下基本使用的 :wq保存退出 :w :q :q! :wq! i I a A 方向键 h左 j下 k上 l右 dd删除方行&#xff08;这其实是剪切行操作&#xff0c;不过一般用作删除&#xff0c;长按可删除&#xff0c;不过按.执行上一次操作删除更快&#xff09; .执行上…...

车载软件架构 --- 基于AUTOSAR软件架构的ECU开发流程小白篇

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…...

汇编基础语法及其示例

1.汇编指令 1.1汇编指令的基本格式 <opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand> <功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数> 注&#xff1a;第一操作寄存器…...

android获取EditText内容,TextWatcher按条件触发

android获取EditText内容&#xff0c;TextWatcher按条件触发 背景&#xff1a;解决方案&#xff1a;效果&#xff1a; 背景&#xff1a; 最近在尝试用原生安卓实现仿element-ui表单校验功能&#xff0c;其中涉及到EditText组件内容的动态校验&#xff0c;初步实现功能后&#…...

Blazor-Blazor Web App项目结构

让我们还是从创建项目开始&#xff0c;来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式&#xff0c;有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…...

【线上问题定位处理】及【性能优化】系列文章

目录 性能优化 性能优化 九大服务架构性能优化方式 如何进行GC调优 如何排查线上系统出现的Full GC MySQL - 性能优化 MySQL - 分库分表 大数据查询的处理方案 MySQL优化手段有哪些 服务CPU100%问题如何快速定位? 服务内存OOM问题如何快速定位? JVM调优6大步骤 线…...

现代 linux 里一个进程允许打开几个文件:答案是 1024 或者更多

&#xff08;1&#xff09; 测试一下&#xff1a; &#xff08;2&#xff09; 谢谢...

【仓颉】仓颉编程语言Windows安装指南 配置环境变量 最简单解决中文乱码问题和其他解决方案大全

适用于版本&#xff1a; 0.53.13 &#xff5c; 发布日期&#xff1a; 2024-10-24 &#xff08;以后的可能也适用&#xff09; 本机windows版本&#xff1a;24H2 内部版本号windows 10.0.26100 因为仓颉的官方文档一直没更新&#xff0c;所以在这里写一下如何在windows上完成这些…...

dm8在Linux环境安装精简步骤说明(2024年12月更新版dm8)

dm8在Linux环境安装详细步骤 - - 2025年1月之后dm8 环境介绍1 修改操作系统资源限制2 操作系统创建用户3 操作系统配置4 数据库安装5 初始化数据库6 实例参数优化7 登录数据库配置归档与备份8 配置审计9 创建用户10 屏蔽关键字与数据库兼容模式11 jdbc连接串配置12 更多达梦数据…...

学技术学英语:elasticsearch查询的两阶段queryingfetching

To understand Elasticsearch’s distributed search, let’s take a moment to understand how querying and fetching work. Unlike simple CRUD tasks, distributed search is like navigating through a maze of shards spread across the cluster. In Elasticsearch, CRU…...

Linux_线程互斥

互斥的相关概念 共享资源&#xff1a;指多个进程或线程可以共同访问和操作的资源临界资源&#xff1a;被保护的共享资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区互斥&#xff1a;任何时刻&#xff0c;互斥保证有…...

基于 NodeJs 一个后端接口的创建过程及其规范 -- 【elpis全栈项目】

基于 NodeJs 一个后端接口的创建过程及其规范 一个接口的诞生&#xff1a; #mermaid-svg-46HXZKI3fdnO0rKV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46HXZKI3fdnO0rKV .error-icon{fill:#552222;}#mermaid-sv…...

企业知识库提升企业核心竞争力促进团队协作和知识分享

内容概要 在快速发展的数字化时代&#xff0c;企业知识库的构建与运用变得愈发重要。其重要性不仅体现在信息的集中管理上&#xff0c;更在于推动企业整体竞争力的提升。一个高效的知识库可以作为团队合作的重要平台&#xff0c;促进不同部门之间的信息交流与协作&#xff0c;…...

C++ unordered_map和unordered_set的使用,哈希表的实现

文章目录 unordered_map&#xff0c;unorder_set和map &#xff0c;set的差异哈希表的实现概念直接定址法哈希冲突哈希冲突举个例子 负载因子将关键字转为整数哈希函数除法散列法/除留余数法 哈希冲突的解决方法开放定址法线性探测二次探测 开放定址法代码实现 哈希表的代码 un…...

games101-作业3

由于此次试验需要加载模型&#xff0c;涉及到本地环节&#xff0c;如果是windows系统&#xff0c;需要对main函数中的路径稍作改变&#xff1a; 这么写需要&#xff1a; #include "windows.h" 该段代码&#xff1a; #include "windows.h" int main(int ar…...

【Block总结】高效多尺度注意力EMA,超越SE、CBAM、SA、CA等注意力|即插即用

论文信息 标题: Efficient Multi-Scale Attention Module with Cross-Spatial Learning 作者: Daliang Ouyang, Su He, Guozhong Zhang, Mingzhu Luo, Huaiyong Guo, Jian Zhan, Zhijie Huang 论文链接: https://arxiv.org/pdf/2305.13563v2 GitHub链接: https://github.co…...