unity编辑器扩展dll形式展示

news2025/6/4 3:45:28

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)

注:后续在制作工具的过程中发现UnityEngine.UI.dll拿不到 这样无法识别Image组件

遇到这种情况可以到你们项目的library目录,然后搜索UnityEngine.UI.dll 然后拷贝到你们的类库工程比如我这个UnityEditorExpand 然后右键项目添加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.Box
        GUILayout.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.coloradmin.cn/o/2396434.html

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

相关文章

vscode中launch.json、tasks.json的作用及实例

文章目录 launch.json是什么作用多环境调试简单实例进阶使用核心配置项解析调试第三方程序 launch.json是什么 顾名思义:它是在.vscode文件夹下的launch.json,所以是vscode启动调试的配置文件。总结:通过定义调试参数、环境变量和启动方式&a…

VScode编译调试debug,gpu的cuda程序,Nsight

进行下面操作的前提是,我们的环境已经能跑简单的CUDA程序了。 一、安装Nsight 二、创建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…

中企出海大会|打造全球化云计算一张网,云网络助力中企出海和AI创新

全球化是阿里云的长期战略,未来阿里云将持续加大云和 AI 基础设施建设投入。首先是加速打造全球化的云计算网络,一张具备 AI技术服务能力和全球竞争力的云计算网络是阿里云的长期目标。 —— 阿里巴巴集团 CEO、阿里云智能集团董事长兼 CEO 吴泳铭 5 月 …

防范DDoS攻击,服务器稳定性崩溃的根源与高效防御对策

DDoS攻击(分布式拒绝服务攻击)已成为危害服务器稳定性和业务连续性的主要因素之一。本文将深入探讨为什么服务器一遇到DDoS攻击就崩溃,以及如何从根本上实现有效防御和应对这一威胁,帮助企业提升网络安全水平。 具体内容如下&…

深入理解 SELinux:通过 Nginx 和 SSH 服务配置实践安全上下文与端口策略

目录 一、引言 二、实验环境说明 三、实验 1:Nginx 服务安全上下文配置 3.1 实验目标 3.2 操作步骤 1. 开启 SELinux 并重启系统 2. 安装 Nginx 并创建自定义目录 3. 配置 Nginx 指向自定义目录 4. 分析 SELinux 上下文冲突 5. 修改上下文为合法类型 6. 验…

C++ —— STL容器——string类

1. 前言 本篇博客将会介绍 string 中的一些常用的函数,在使用 string 中的函数时,需要加上头文件 string。 2. string 中的常见成员函数 2.1 初始化函数 string 类中的常用的初始化函数有以下几种: 1. string() …

用JS实现植物大战僵尸(前端作业)

1. 先搭架子 整体效果&#xff1a; 点击开始后进入主场景 左侧是植物卡片 右上角是游戏的开始和暂停键 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

Electron-vite【实战】MD 编辑器 -- 文件列表(含右键快捷菜单,重命名文件,删除本地文件,打开本地目录等)

最终效果 页面 src/renderer/src/App.vue <div class"dirPanel"><div class"panelTitle">文件列表</div><div class"searchFileBox"><Icon class"searchFileInputIcon" icon"material-symbols-light:…

华为云Flexus+DeepSeek征文|华为云Flexus云服务器X实例上部署Dify:打造高效的开源大语言模型应用开发平台

目录 前言 1 Dify与华为云部署概述 1.1 什么是 Dify 1.2 华为云与 Flexus 云服务器的优势 2 云服务器部署 Dify 的步骤详解 2.1 模板选择 2.2 参数配置 2.3 资源栈设置 2.4 确认部署信息并执行 3 部署成功后的操作与平台使用指南 3.1 访问平台 3.2 设置管理员账号 …

高密爆炸警钟长鸣:AI为化工安全戴上“智能护盾”

一、高密爆炸&#xff1a;一声巨响&#xff0c;撕开化工安全“伤疤” 2025年5月27日&#xff0c;山东高密友道化学有限公司的车间爆炸声&#xff0c;像一把利刃划破了化工行业的平静。剧烈的冲击波将车间夷为平地&#xff0c;黑色蘑菇云腾空而起&#xff0c;刺鼻的化学气味弥漫…

机器人学基础——正运动学(理论推导及c++实现)

机器人正运动学 机器人正运动学一般是指从机器人的关节位置到基于参考坐标系下末端执行器的位置。 平移变换和旋转变换 平移变换 假设我们有两个坐标系A和B&#xff0c;坐标系A与B的方位相同&#xff0c;xyz轴的指向都是一致的&#xff0c;即没有旋转变换。有一点p&#xf…

[网页五子棋][对战模块]处理连接成功,通知玩家就绪,逻辑问题(线程安全,先手判定错误)

文章目录 处理连接成功通知玩家就绪逻辑图问题 1&#xff1a;线程安全问题 2&#xff1a;先手判定错误两边都是提示&#xff1a;轮到对方落子![image.png](https://i-blog.csdnimg.cn/img_convert/c570cd26eadbe87ed467bc4edaa7945e.png) 处理连接成功 实现 GameAPI 的 afterC…

【Web应用】若依框架:基础篇11功能详解-系统接口

文章目录 ⭐前言⭐一、课程讲解⭐二、自己动手实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数据库、操作系统、大数据、人工智能、工控、网络、…

【Docker项目实战篇】Docker部署PDF查看器PdfDing

【Docker项目实战篇】Docker部署PDD查看器PdfDing 一、PdfDing介绍1.1 PdfDing简介1.2 PdfDing主要特点1.3 主要使用场景 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Pd…

【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程—详解!

hi&#xff0c;我是云边有个稻草人 偶尔中二的博主^(*&#xffe3;(oo)&#xffe3;)^&#xff0c;与你分享专业知识&#xff0c;祝博主们端午节快乐&#xff01; Linux—本节博客所属专栏—持续更新中—欢迎订阅&#xff01; 目录 一、冯诺依曼体系结构 二、操作系统(Opera…

数据结构——优先级队列(PriorityQueue)

1.优先级队列 优先级队列可以看作队列的另一个版本&#xff0c;队列的返回元素是由是由插入顺序决定的&#xff0c;先进先出嘛&#xff0c;但是有时我们可能想要返回优先级较高的元素&#xff0c;比如最大值&#xff1f;这种场景下就由优先级队列登场。 优先级队列底层是由堆实…

代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包依赖包安装包加载需要的R包数据下载以及转换mzML数据预处理代谢物注释LipidFinder过滤MultiABLER数据预处理过滤补缺失值对数变换数据标准化下游数据分析总结系统信息参考介…

【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议

Chapter.1 AXI4总线协议 作者&#xff1a;齐花Guyc(CAUC) 一、总线介绍 AXI4总线 AXI4总线就像是SoC内部的“高速公路”&#xff0c;负责在不同硬件模块之间高效传输数据。 AXI4协议通过 5个独立通道 传输数据和控制信号&#xff0c;每个通道都有自己的信号线&#xff0c;互…

把 jar 打包成 exe

1. 把自己的项目先正常打成jar包 2. 使用exe4j工具将jar转换为exe 2.1 exe4j下载地址&#xff1a;https://www.ej-technologies.com/download/exe4j/files 2.2 下载完成之后激活 2.3 可以点击Change License&#xff0c;输入秘钥L-g782dn2d-1f1yqxx1rv1sqd 2.4 直接下一步…

【目标检测】检测网络中neck的核心作用

1. neck最主要的作用就是特征融合&#xff0c;融合就是将具有不同大小感受野的特征图进行了耦合&#xff0c;从而增强了特征图的表达能力。 2. neck决定了head的数量&#xff0c;进而潜在决定了不同尺度样本如何分配到不同的head&#xff0c;这一点可以看做是将整个网络的多尺…