unity编辑器扩展dll形式展示

article/2025/8/28 1:00:26

1.背景:最近搞工程迁移发现一旦c#报错就会导致编辑器菜单没法使用,做了一些尝试发现使用dll的方式会是不错的选择。当然有些工具还是建议用外部的c#工程来写比如winform.

2.遇到的问题:我记得之前2017年左右的时候做一个unity的dll工程并不需要引入多少unity的内置dll一般引入UnityEngine.UI.dll 以及UnityEngine.dll就可以了

看看现在的编辑器使用的dll(你的目录\Unity\Hub\Editor\2021.3.41f1\Editor\Data\Managed\UnityEngine\一堆dll)

实例:SceneViewUI.cs 这个例子会比较直观 生成dll 放在unity的Assets/Plugin/Editor(自行构建)/xx.dll  以及xx.pdb(支持调试功能)

using System;
using System.IO;
using System.Reflection;
using UnityEditor;
using UnityEngine;[InitializeOnLoad]
public class SceneViewUI
{static SceneViewUI(){// 订阅 SceneView.duringSceneGui 事件SceneView.duringSceneGui += OnSceneGUI;}private static void OnSceneGUI(SceneView sceneView){//if(sceneView.camera.orthographic) // 如果是2d模式直接return //{//    return;//}// 在 Scene 视图中绘制文本Handles.BeginGUI();var oldColor = GUI.color;GUI.color = Color.black;Rect sceneViewRect = SceneView.currentDrawingSceneView.position;// 计算 Box 在右下角的位置float boxX = sceneViewRect.width - 300;float boxY = sceneViewRect.height - 50;// 创建一个 GUILayout 区域,将其放置在右下角GUILayout.BeginArea(new Rect(boxX, boxY, 300, 100));// 创建一个 GUILayout.BoxGUILayout.Box("按下F12直接跳转到选中gameObject对应的代码行");GUILayout.EndArea();Vector3 bottomLeftWorld = sceneView.camera.ViewportToWorldPoint(new Vector3(0, 0, sceneView.camera.nearClipPlane));Vector2 bottomLeftScreen = HandleUtility.WorldToGUIPoint(bottomLeftWorld);var rect = new Rect(bottomLeftScreen.x, bottomLeftScreen.y - 20, 200, 20);var size = GameViewTools.GameViewSize();string isLand = (size.x > size.y) ? "横屏" : "竖屏";GUI.Label(rect, $"屏幕({isLand})分辨率为:({size.x},{size.y})");GUI.color = oldColor;rect = new Rect(rect.x, rect.y - 20, 200, 20);if (GUI.Button(rect, "启动游戏")){EasyUseEditorTool.OnSceneOpenOrPlay("Assets/scenes/GameStart.unity");}rect = new Rect(rect.x, rect.y - 20, 200, 20);if ((!EditorPrefs.GetBool("InitializerUiEdit", false) && GUI.Button(rect, "锁定分辨率"))|| (EditorPrefs.GetBool("InitializerUiEdit", false) && GUI.Button(rect, "解除锁定分辨率"))){EditorPrefs.SetBool("InitializerUiEdit", !EditorPrefs.GetBool("InitializerUiEdit", false));}rect = new Rect(rect.x, rect.y - 20, 200, 20);if ((!EditorPrefs.GetBool("SelectionTools", true) && GUI.Button(rect, "资源自动展开"))|| (EditorPrefs.GetBool("SelectionTools", true) && GUI.Button(rect, "解除资源自动展开"))){EditorPrefs.SetBool("SelectionTools", !EditorPrefs.GetBool("SelectionTools", false));AssetDatabase.Refresh();}rect = new Rect(rect.x, rect.y - 20, 200, 20);if ((!EditorPrefs.GetBool("customlog", false) && GUI.Button(rect, "开启自定义日志"))|| (EditorPrefs.GetBool("customlog", false) && GUI.Button(rect, "关闭自定义日志"))){EditorPrefs.SetBool("customlog", !EditorPrefs.GetBool("customlog", false));}rect = new Rect(rect.x, rect.y - 20, 200, 20);if (GUI.Button(rect, "打包")){var classType = Type.GetType("PackHelper,Assembly-CSharp-Editor");var binds = BindingFlags.Static | BindingFlags.Instance |BindingFlags.Public | BindingFlags.NonPublic;var methodInfo = classType.GetMethod("BundleSetting",binds);methodInfo.Invoke(null,null);}rect = new Rect(rect.x, rect.y - 20, 200, 20);if (GUI.Button(rect, "资源冗余检查&清理资源")){Resolution rs = Screen.currentResolution; //获取当前的分辨率 int nWidth = 600;int nHeight = 500;int x = (rs.width - nWidth) / 2;int y = (rs.height - nHeight) / 2;Rect rect2 = new Rect(x, y, nWidth, nHeight);FindRepeatRes myWindow = (FindRepeatRes)EditorWindow.GetWindowWithRect(typeof(FindRepeatRes), rect2, true,"资源查重&合并");myWindow.position = rect2;myWindow.Show();//展示 myWindow.closeAction += EditorLogWindow.CloseWindow;EditorCoroutine.StartCoroutine(new EditorWaitForSeconds(0.01f, () =>{EditorLogWindow.OpenWindow(myWindow);myWindow.Focus();}));}rect = new Rect(rect.x, rect.y - 20, 200, 20);if (GUI.Button(rect, "代码同步")){CodeMoveTool.ShowWindow();}rect = new Rect(rect.x, rect.y - 20, 200, 20);if (GUI.Button(rect, "清理缓存")){EditorPrefs.DeleteAll();PlayerPrefs.DeleteAll();string path = Application.persistentDataPath + "/GamebalootRankMatchResult.txt";if (File.Exists(path)){Debug.Log("清理GamebalootRankMatchResult成功");File.Delete(path);}}Handles.EndGUI();}
}

编辑器拓展界面截图:

dll生成 :

右键工程属性 点击生成->事件->生成后事件 配置如下:

xcopy "$(TargetDir)$(TargetName).dll" "D:\code_move1\Assets\Plugins\Editor\" /Y
xcopy "$(TargetDir)$(TargetName).pdb" "D:\code_move1\Assets\Plugins\Editor\" /Y

dll放置位置截图:


http://www.hkcw.cn/article/QaHfDiuFPL.shtml

相关文章

Nacos | 三种方式的配置中心,整合Springboot3.x + yaml文件完成 0错误 自动刷新(亲测无误)

目录 ValueRefreshScope 导入配置依赖 启动类 添加 EnableDiscoveryClient 控制器 编写 yaml 文件 创建 Nacos Data Id 项目启动问题 测试 ConfigurationProperties 无感自动刷新 导入配置依赖 启动类 添加 EnableDiscoveryClient 控制器 Nacos DataID 模板映射 编…

[嵌入式实验]实验五:freeRTOS

一、实验目的 熟悉开发环境在开发板上通过freeRTOS进行LED控制 二、实验环境 硬件:STM32开发板、CMSIS-DAP调试工具 软件:STM32CubeMX软件、ARM的IDE:Keil C51 三、实验内容 1.实验原理 freeRTOS是一种专门设计的嵌入式实时操作系统&…

【Unity】 HTFramework框架(六十六)缺省的运行时组件检视器

更新日期:2025年5月29日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、缺省的运行时组件检视器1.自定义运行时组件检视器 二、使用缺省的运行时组件检视器1.定义组…

Ollama v0.8.0 发布,支持通过工具调用进行流式响应!

在 2025 年 5 月 29 日的 AI 技术浪潮中,实时交互性和高效性成为 AI 应用的核心需求。Ollama 作为一个开源的大型语言模型服务器,持续更新以满足开发者需求。Ollama v0.8.0 的发布特别引入了支持通过工具调用进行流式响应的功能,这一更新引发…

LVS+Keepalived 高可用群集

目录 一、 Keepalived 双机热备核心技术 1.1 Keepalived 架构与 VRRP协议 1.2 双机热备配置深度优化 二、 LVSKeepalived 高可用负载均衡架构 2.1 系统架构设计 2.2 LVS集成配置详解 三、 关键技术与疑难解析 3.1 DR模式 ARP 仰制机制 3.2 健康检查策略优化 四、 企业…

python + vscode 开发环境搭建

一、下载安装Python Python 官网链接Welcome to Python.org 二、Python3.12.7安装 三、Python虚拟环境 开发编译器使用Vscode 1、打开VsCode,键盘输入ctrl shift p 点击完了会在文件夹目录下出现一个.venv的路径。 虚拟环境的作用是隔离不同项目的 Python 环境…

[ Qt ] | QRadioButton和QCheckBox的使用

目录 QRadioButton 常用属性 clicked(bool)信号、pressed信号、released信号 小项目 QRadioButton QRadioButton是一个单选按钮,也是继承自QAbstractButton(继承自QWidget) 常用属性 checkable 是否能选中 checked 是否已经被选中 autoExclusive 是否排…

关于无法下载Qt离线安装包的说明

不知道出于什么原因考虑,Qt官方目前不提供离线的安装包下载,意味着网上各种文章提供的各种下载地址都失效了,会提示Download from your IP address is not allowed,当然目前可以在线安装,但是据说只提供了从5.15开始的…

github双重认证怎么做

引言 好久没登陆github了, 今天登陆github后,提醒进行2FA认证。 查看了github通知,自 2023 年 3 月起,GitHub 要求所有在 GitHub.com 上贡献代码的用户启用一种或多种形式的双重身份验证 (2FA)。 假如你也遇到这个问题&#xf…

多部手机连接同一wifi的ip一样吗?

在家庭和办公环境中,多台手机同时连接同一个WiFi路由器已成为常态。不少用户会产生疑问:这些设备的IP地址会相同吗?下面就一起来了解一下吧。 一、多部手机连接同一WiFi的IP‌一样吗 多部手机连接同一WiFi时的IP地址是否相同,需要…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.7 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.7 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图&#xff0c;等值线图。 dataframe <-data.frame…

如何打造一份出色的技术文档?

文章目录 每日一句正能量前言一、明确文档的目标和受众二、合理规划文档结构三、注重内容的清晰性和准确性四、持续更新和优化文档五、实用工具推荐六、案例分享示例&#xff1a;如何使用Python编写一个简单的Web应用引言背景知识安装和配置使用指南高级用法常见问题参考文献 七…

记一次 Starrocks be 内存异常宕机

突发性 be 内存飙高&#xff0c;直至被系统 kill 掉&#xff0c;be 内存如下&#xff1a;其中 starrocks_be_update_mem_bytes 指标打满&#xff0c;重启也是如此 [rootlocalhost bin]# curl -XGET -s http://192.168.1.49:8040/metrics | grep "^starrocks_be_.*_mem_b…

阿里云服务器邮件发送失败(dail tcp xxxx:25: i/o timeout)因为阿里云默认禁用 25 端口

最近在测试发送邮件的功能&#xff0c;发现了一个奇怪的问题&#xff0c;同样的 docker 镜像&#xff0c;在本地跑起来是可以正常发送邮件的&#xff0c;但是在阿里云的服务器上跑&#xff0c;就会报错 i/o timeout。 排查了一圈发现&#xff0c;原来是阿里云的操作&#xff0…

什么叫做回表?

指的是在Mysql中使用非聚簇索引&#xff0c;也就是使用二级索引进行作为条件进行查询时&#xff0c;查询了除索引之外的数据&#xff0c;需要根据获得的主键去聚簇索引&#xff0c;查询其他的所需的数据。 有表格&#xff08;id,name,age&#xff09;,进行查询select * from w…

pikachu靶场通关笔记08 XSS关卡04-DOM型XSS

目录 一、XSS原理 二、DOM型XSS 三、源码分析 1、进入靶场 2、XSS探测 3、源码分析 四、渗透实战 1、Payload1 2、Payload2 3、Payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c;通过对XSS关卡源码的代码审计找到XSS风…

Python打卡第39天

浙大疏锦行 作业&#xff1a; """ DAY 39 图像数据与显存 本节主要介绍深度学习中的图像数据处理和显存管理。 """import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as…

SQLite 中文写入失败问题总结

SQLite 中文写入失败问题总结与解决方案 在 Windows 下使用 C 操作 SQLite 数据库时&#xff0c;中文字段经常出现 写入成功但内容显示为 BLOB 或 乱码 的问题。根本原因在于 SQLite 要求字符串以 UTF-8 编码 存储&#xff0c;而默认的 std::string 中文通常是 GB2312/ANSI 编…

63、【OS】【Nuttx】任务休眠与唤醒:sleep

背景 之前的 blog 分析了 Nuttx 编码规范 62、【OS】【Nuttx】编码规范解读&#xff08;十&#xff09; 接下来继续分析下 Nuttx OS 的一个核心功能&#xff0c;任务休眠与唤醒 任务休眠 先来看任务休眠&#xff0c;关键函数 sleep&#xff0c;sleep函数是 C 标准库中的一个…

PostgreSQL学会如何建表

开始使用PostgreSQL之前&#xff0c; 上一节我们说了怎样安装它。 PostgreSQL可能已经安装到你的电脑上了,安装后postgre服务默认在电脑开机时运行启动。 一.了解PostgreSQL的运行 PostgreSQL使用一种客户端/服务器&#xff08;C/S&#xff09;模型。 和其他典型的客户端/服务…