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

最后我们来看看效果:

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络之网络层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 03 网络层 在网上看到其他人做了相关笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 1 详解网络层-网络层概述和编址【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51CTO博客 2 …

Geek Uninstaller,绿色免安装轻量的应用卸载工具!

软件介绍 链接 一个轻量级拥有简洁交互界面、快速卸载电脑安装程序的工具。可快速扫描删除残余文件和注册表&#xff0c;对顽固和损坏的程序可执行强制删除、独立页面管理卸载系统Microsoft Store应用、快速打开程序安装文件夹、快速打开编辑程序注册表位置、将安装程序列表导…

解释 RESTful API,以及如何使用它构建 web 应用程序

RESTful API是一种设计和构建Web服务的架构风格&#xff0c;它遵循一组规范和约定&#xff0c;使客户端能够通过HTTP协议进行与服务器的通信&#xff0c;并进行资源的创建、读取、更新和删除操作。 REST&#xff08;Representational State Transfer&#xff09;表示资源的状态…

工业“MCU+AI”

随着工业4.0的推进&#xff0c;传统工业设备正向智能化和自动化方向转型。这要求设备具备更高的算力、更强的实时处理能力以及支持AI算法的能力&#xff0c;以应对工业机器人、电机控制、预测性维护等复杂应用场景。 近年来越来越多的芯片厂商纷纷推出工业“MCUAI”产品&#…

优选算法——哈希表

目录 1. 哈希表简介 2. 两数之和 3. 判定是否为字符重排 4. 存在重复元素 5. 字母异位词分组 1. 哈希表简介 2. 两数之和 题目链接&#xff1a;1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&#xff1a; 大家来看上面的图&…

阴沟翻船题——Longest Substring Without Repeating Characters

一、事件概述 今天接到一个面试&#xff0c;让线上做题。面试官出了个leetcode的题。题目如图所示&#xff1a; 我没有刷过leetcode&#xff0c;上学时候我们做的hdu-acm和codeforces。咋一接到题目&#xff0c;看到是个字符串题&#xff0c;并且找最长字串&#xff0c;第一反…

k8s使用nfs持久卷

开启持久化卷后可以实现服务开启在不同节点也能读取到和拿到服务节点的文件。 基本流程为将集群中一个节点作为服务节点安装共享储存应用的服务端选择目录和开启端口&#xff0c;其他节点根据端口挂载目录。然后使用kubesphere选择相应的镜像并将端口信息和挂载目录信息作为参…

数据结构测试题2

一、单选题&#xff08;每题 2 分&#xff0c;共20分&#xff09; 1. 栈和队列的共同特点是( A )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2. 用链接方式存储的队列&#xff0c;在进行插入运算时( C ) A. 仅修改头指针 B. 头…

嵌入式知识点总结 操作系统 专题提升(一)-进程和线程

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.什么是进程&#xff1f;什么是线程&#xff1f; 2.进程和线程有什么区别&#xff1f; 3.何时使用多进程&#xff0c;何时使用多线程&#xff1f; 4.进程有几种状态&#xff…

Spring Security(maven项目) 3.0.2.6版本—总

通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往复以至无穷&#xf…

【2024年华为OD机试】(A卷,200分)- 简单的解压缩算法 (JavaScriptJava PythonC/C++)

一、问题描述 题目描述 现需要实现一种算法&#xff0c;能将一组压缩字符串还原成原始字符串&#xff0c;还原规则如下&#xff1a; 字符后面加数字N&#xff0c;表示重复字符N次。例如&#xff1a;压缩内容为 A3&#xff0c;表示原始字符串为 AAA。花括号中的字符串加数字N…

K8S中Service详解(一)

Service介绍 在Kubernetes中&#xff0c;Service资源解决了Pod IP地址不固定的问题&#xff0c;提供了一种更稳定和可靠的服务访问方式。以下是Service的一些关键特性和工作原理&#xff1a; Service的稳定性&#xff1a;由于Pod可能会因为故障、重启或扩容而获得新的IP地址&a…

jenkins-k8s pod方式动态生成slave节点

一. 简述&#xff1a; 使用 Jenkins 和 Kubernetes (k8s) 动态生成 Slave 节点是一种高效且灵活的方式来管理 CI/CD 流水线。通过这种方式&#xff0c;Jenkins 可以根据需要在 Kubernetes 集群中创建和销毁 Pod 来执行任务&#xff0c;从而充分利用集群资源并实现更好的隔离性…

LabVIEW滤波器选择与参数设置

在信号处理应用中&#xff0c;滤波器是去除噪声、提取目标信号的重要工具。LabVIEW 提供多种类型的滤波器&#xff08;如低通、高通、带通、带阻&#xff09;&#xff0c;用户需要根据采样频率、信号特性和应用需求合理选择滤波器类型及参数设置。本文以 采样率 100kHz&#xf…

iOS中的设计模式(四)- 抽象工厂

引言 在软件设计中&#xff0c;创建一个类的对象通常需要客户端知道该类的所有细节。而当需要同时创建一组相关对象时&#xff0c;且这些对象在运行时会根据不同的标准有所变化&#xff0c;这会变得更加复杂。此时&#xff0c;抽象工厂模式能够有效地简化这一过程。 抽象工厂…

deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_12

目录 1、下载链接1.1、CSDN链接&#xff0c;含权重文件直接使用&#xff0c;建议直接下这个&#xff0c;还不限速。1.2 Github链接&#xff1a;2、下载代码&#xff0c;下载预训练好的权重3、预测代码4、像素提取&#xff0c;或者说类别提取5、文档部分内容截图6、其他数据处理…

Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Jetson Xavier NX 安装 CUDA 支持的 PyTorch 指南

本指南将帮助开发者完成在 Jetson Xavier NX 上安装 CUDA 支持的 PyTorch。 安装方法 在 Jetson 上安装 Pytorch 只有两种方法。 一种是直接安装他人已经编译好的 PyTorch 轮子&#xff1b;一种是自己从头开始开始构建 PyTorch 轮子并且安装。 使用轮子安装 可以从我的 Gi…

怎样使用树莓派自己搭建一套ADS-B信号接收系统

0 我们知道&#xff0c;ADS-B全称广播式自动相关监视系统&#xff0c;其实就是飞机发出的广播信号&#xff0c;用明码来对外发送自己的位置、高度、速度、航向等信息&#xff0c;是公开信息。连续接收到一架飞机发出的ADS-B信息后&#xff0c;可以通过其坐标点来描绘出飞机的航…

KETTLE-SAP抽数报错RFC_ERROR_SYSTEM_FAILURE

KETTLE调SAP 合并ECCS相关的函数时报错 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : Unexpected error 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-3…