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

Unity 两篇文章熟悉所有编辑器拓展关键类 (上)

         本专栏基础资源来自唐老狮和siki学院,仅作学习交流使用,不作任何商业用途,吃水不忘打井人,谨遵教诲

         编辑器扩展内容实在是太多太多了(本篇就有五千字++)

        所以分为两个篇章而且只用一些常用api举例,更多的还是起到留下学习印象的作用

        就像引用类型的堆和栈一样,本文提供栈的作用,指向的内存堆为官方文档

什么是编辑器扩展

        Unity编辑器扩展是指通过编写自定义脚本和插件,利用Unity提供的API来增强和扩展Unity编辑器的功能,这些扩展可以显著提高开发效率和灵活性 

        前置知识:GUI 

        可能需要熟悉的知识: EditorGUI - Unity 脚本 API

     大部分的编辑器扩展脚本都需要写在Editor文件中,这样unity打包的时候,不会打包出去该文件

1.MenuItem类

作用:在unity未运行时 一键使用自定义静态函数

MenuItem - Unity 脚本 API --- MenuItem - Unity 脚本 API

1.创建菜单栏

 [MenuItem("扩展菜单名/一级菜单名/方法名任意")] 菜单级数任意

实现效果如下

引入命名空间,函数必须为静态函数

using UnityEngine;
public class T1 
{//在unity不同的地方一键执行静态函数[MenuItem("扩展菜单名/TestMethod/Function1")]public static void Function1(){Debug.Log("输出任意一句话");}
}

可以添加特殊标识符,在不同的窗口创建使用,而不只是通过菜单栏中去选择

类似这样

总结一下规则如下图

2.绑定快捷键规则 

3.在组件菜单中拓展自定义脚本

[AddComponentMenu("一级菜单/二级菜单/脚本名建议和实际脚本一致")] 菜单级数任意

众所周知 ,在unity中脚本就可以理解为组件

所以在菜单栏中的组件菜单中,是可以将自定义的脚本添加进去的

使用特性AddComponentMenu: 

//在组件菜单中添加 自定义脚本(组件)
[AddComponentMenu("一级菜单/二级菜单/脚本名")]
public class T2 : MonoBehaviour
{}

选中物品就可以添加了

4.为脚本添加使用自定义函数

[MenuItem("CONTEXT/脚本名/一级菜单名/函数名任意")]  菜单级数任意

//在组件菜单中添加 自定义脚本(组件)
[AddComponentMenu("一级菜单/二级菜单/脚本名")]
public class T2 : MonoBehaviour
{[MenuItem("CONTEXT/T2/一级菜单名/Function1")]public static void Function2() {Debug.Log("输出任意一句话");}
}

 2.EditorWindow 类

         官方文档:EditorWindow - Unity 脚本 API 

        继承了 EditorWindow类的编辑器脚本, 你可以在这个窗口中添加自定义方法,如下图演示将创建一个名为Name,有一个任意内容label的窗口

例如如下窗口

public class Window : EditorWindow
{[MenuItem("MyWindow/window1")]private static void MyWindow(){Window w =EditorWindow.GetWindow<Window>("Name");w.Show();}private void OnGUI() {GUILayout.Label("任意内容");}
}

3.EditorGUILayout类

        在具体绘制这一点,unity提供了一个新的类叫做EditorGUILayout,功能与GUILayout相似加入了自动布局功能

EditorGUILayout - Unity 脚本 API

        举例:每种元素都用常用api

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor;
using UnityEngine;public class Window : EditorWindow
{[MenuItem("MyWindow/window1")]private static void MyWindow(){Window w =EditorWindow.GetWindow<Window>("Name");w.Show();}//层级和标签int layer;string tag;//选择枚举enum E_AnyType{ a=1,b=2,c=4,d=8,//要将枚举中的变量定义为2的幂次方,原因是多选枚举时,是按照 或运算 将得出的结果记录下来//比如a=1,二进制为0001,b=2,二进制为0010,或运算后结果为0011 = 3 //如果不按此规则,a=1,b=2,c=3,当a|b之后,得到的结果就变成了c,而不是多选a和b}E_AnyType single;E_AnyType multiple;//字符串选择对应数组值int returnNum;string[] options = { "op1", "op2", "op3", "op4" };int[] result = { 1,2,3,4};//关联资源GameObject obj;int value;//整形输入框//折叠控件bool isHide;bool isGroupHide;//滑动条float slider;int intSlider;float min;float max;private void OnGUI() {EditorGUILayout.LabelField("页签");layer =EditorGUILayout.LayerField(layer);//return inttag =EditorGUILayout.TagField("标签");//return stingsingle = (E_AnyType)EditorGUILayout.EnumPopup("单选枚举",single);//return typeof(E_AnyType)multiple = (E_AnyType)EditorGUILayout.EnumFlagsField("多选枚举",multiple);returnNum = EditorGUILayout.IntPopup("字符串对应数组", returnNum, options, result);EditorGUILayout.LabelField(returnNum.ToString());EditorGUILayout.DropdownButton(new GUIContent("按钮"), FocusType.Passive);//return boolisHide = EditorGUILayout.Foldout(isHide,"折叠控件 bool包裹内容");if(isHide){obj = EditorGUILayout.ObjectField("关联资源对象框", obj, typeof(GameObject), true) as GameObject;value = EditorGUILayout.IntField("输入框", value);}isGroupHide = EditorGUILayout.BeginFoldoutHeaderGroup(isGroupHide,"折叠组控件 必须包括开始和结束");EditorGUILayout.EndFoldoutHeaderGroup();//开关和开关组类似于折叠控件 关键词:Toggleslider =EditorGUILayout.Slider("滑动条",slider,0,1);intSlider = EditorGUILayout.IntSlider("整型滑动条",intSlider,0,1);//双块滑动条EditorGUILayout.MinMaxSlider("双块",ref min,ref max,0,1);EditorGUILayout.Space(10);//间隔框//提示框EditorGUILayout.HelpBox("提示框",MessageType.Warning);//MessageType选择类型}
}

4.EditorGUIUtility类

       该类是 EditorGUI 的各种辅助程序

文档EditorGUIUtility - Unity 脚本 API

public class 资源加载和工具类 : EditorWindow
{[MenuItem("资源加载部分/openWindow")]private static void OpenWindow(){资源加载和工具类 l = EditorWindow.GetWindow<资源加载和工具类>("资源加载与工具示例");l.Show();}Texture texture;private void OnGUI() {//加载Editor Default Resources 文件夹下的资源 要求有后缀名texture = EditorGUIUtility.Load("test.jpg") as Texture;//有判空方法 EditorGUIUtility.LoadRequired() GUI.DrawTexture(new Rect(0,50,100,100),texture);//绘制//搜索框和选择资源if (EditorGUILayout.DropdownButton(new GUIContent("打开资源搜索框"), FocusType.Passive))EditorGUIUtility.ShowObjectPicker<Texture>(null,true,"",0);//搜索if(Event.current.commandName == "ObjectSelectorUpdated") {texture = EditorGUIUtility.GetObjectPickerObject() as Texture;//获取EditorGUIUtility.PingObject(texture);//高亮选中资源在Project中Debug.Log(texture.name);}//窗口事件传递 当SendEvent(e)执行后 会发出一个ExecuteCommand枚举类型 只需要检测这个类型 并且事件名相同即可接收if (EditorGUILayout.DropdownButton(new GUIContent("传递事件按钮"), FocusType.Passive)){Event e = EditorGUIUtility.CommandEvent("事件名");SendEvent(e);}//接收事件窗口 可以写在其他窗口之中 if (Event.current.type == EventType.ExecuteCommand && Event.current.commandName == "事件名") {Debug.Log("接收到了事件");}}
}

5.Selection类

        用于访问编辑器中的选择对象,这个类过于简单了,就不做演示,可以自行查看文档或看下面唐老师的注释

文档Selection - Unity 脚本 API

       #region 知识点一 获取当前选择的Object//获取当前在面板上选择的游戏物体Object//未选择则返回Null//选择多个则返回第一个选择的游戏物体//Selection.activeObject#endregion#region 知识点二 获取当前选择的GameObject//获取当前在面板上选择的游戏物体GameObject//未选择则返回Null//选择多个则返回第一个选择的游戏物体//Selection.activeGameObject#endregion#region 知识点三 获取当前选择的Transform//获取当前在面板上选择的游戏物体的Transform//未选择则返回Null//选择多个则返回第一个选择的游戏物体//Selection.activeTransform//只能获取到场景中的对象的Transform#endregion#region 知识点四 获取当前选择的所有Object//获取当前在面板上选择的物体数组//未选择则返回Null//Selection.objects #endregion#region 知识点五 获取当前选择的所有GameObject//获取当前在面板上选择的游戏物体或Project中预设体 GameObject数组//未选择则返回Null//Selection.gameObjects//可以遍历获取所有信息#endregion#region 知识点六 获取当前选择的所有Transform//获取当前在面板上选择的游戏物体Transform数组//未选择则返回Null//Selection.transforms//可以遍历获取所有信息#endregion}

6.Event类

        作用:检测Unity中的事件/输入,或者是 用于UnityGUI 布局/渲染事件  

        你如果将此类写在OnGUI之中并配合EditorWindow的话那么其所有的方法与属性都将与自定义窗口有关

文档Event - Unity 脚本 API

         由于api过多且简单,故不做全部演示

  private void OnGUI() {//有一个大类 Event.currentVector2 mousePostion = Event.current.mousePosition;Debug.Log(mousePostion);}

      

相关文章:

Unity 两篇文章熟悉所有编辑器拓展关键类 (上)

本专栏基础资源来自唐老狮和siki学院&#xff0c;仅作学习交流使用&#xff0c;不作任何商业用途&#xff0c;吃水不忘打井人&#xff0c;谨遵教诲 编辑器扩展内容实在是太多太多了&#xff08;本篇就有五千字&#xff09; 所以分为两个篇章而且只用一些常用api举例&#xff0c…...

Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)

一、什么是 SPI SPI 全名 Service Provider interface&#xff0c;翻译过来就是“服务提供接口”。基本效果是&#xff0c;申明一个接口&#xff0c;然后通过配置获取它的实现&#xff0c;进而实现动态扩展。 Java SPI 是 JDK 内置的一种动态加载扩展点的实现。 一般的业务代…...

合并排序算法(C语言版)

#include <stdio.h> void Copy(int *a, int *b, int left, int right) { int i; for(i0;i<right-left1;i) { a[ileft] b[i]; } } // 将 a[left,middle] 和 a[middle1,right]合并到 b[left, right]中 void Merge(int *a, int left, int midd…...

C++——输入一行文字,找出其中的大写字母、小写字母、空格数字以及其他字符各有多少。用指针或引用方法处理。

没注释的源代码 #include <iostream> using namespace std; int main() { char c; int ul0,ll0,sp0,di0,other0; cout<<"please input script c:"; while(cin.get(c)) { if(c\n) break; else if(c>A&&…...

【skywalking】maximum query complexity exceeded 3336 > 3000

问题 skywalking相关版本信息 jdk&#xff1a;17skywalking&#xff1a;10.1.0apache-skywalking-java-agent&#xff1a;9.3.0ElasticSearch : 8.8.2 问题描述 maximum query complexity exceeded 3336 > 3000 最大查询复杂度超过3336>3000 可能原因 查询条件过于复…...

开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一个开发的聊天应用与AI开发框架&#xff0c;集成 ChatGPT&#xff0c;支持私有部署的源码。 介绍 当前系统集成了ChatGPT的聊天应用&#xff0c;不仅提供了基本的即时通讯功能&#xff0c;还引入了先进的AI技术&#x…...

开发了一个成人学位英语助考微信小程序

微信小程序名称&#xff1a;石榴英语 全称&#xff1a;石榴英语真题助手 功能定位 北京成人学士学位英语辅助学习工具&#xff0c;包含记高频单词&#xff0c;高频词组&#xff0c;专项练习&#xff0c;模拟考试等功能。 开发背景 个人工作需要提高学习英文水平&#xff…...

LeetCode16:最接近的三数之和

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xf…...

VisualStudio2022配置2D图形库SFML

文章目录 1. 下载安装SFML库2. 创建C项目并配置SFML配置include目录和库目录链接SFML库配置动态链接库 3. 测试 1. 下载安装SFML库 SFML&#xff08;Simple and Fast Multimedia Library&#xff09;C库&#xff0c;适合2D游戏和图形界面&#xff0c;提供了以下模块&#xff1…...

「Mac畅玩鸿蒙与硬件4」鸿蒙开发环境配置篇4 - DevEco Studio 高效使用技巧

本篇将进一步介绍如何在 DevEco Studio 中高效使用各种功能&#xff0c;通过掌握快捷键、代码补全、调试工具等&#xff0c;帮助开发者在鸿蒙应用开发中大幅提升工作效率。 关键词 DevEco Studio快捷键代码补全调试工具项目导航 一、快捷键与高效操作 快捷键是提升开发效率的…...

构建生产级的 RAG 系统

对 RAG 应用程序进行原型设计很容易&#xff0c;但要使其高性能、健壮且可扩展到大型知识语料库却很困难。 本指南包含各种提示和技巧&#xff0c;以提高 RAG 工作流程的性能。我们首先概述一些通用技术 - 它们按照简单到复杂的顺序进行排列。然后&#xff0c;我们将更深入地研…...

完全透彻了解一个asp.net core MVC项目模板2

这是《完全透彻了解一个asp.net core MVC项目模板》的第二篇&#xff0c;如果你直接进入了本篇博文而不知道上下文&#xff0c;请先阅读《完全透彻了解一个asp.net core MVC项目模板》的第一篇。 文章目录 一、补充几个问题1、有关导航链接和Tag Helper2、_ViewStart.cshtml与…...

uniapp 如何调用音频

uniapp调用音频 button点击 <view><button click"startPlay">开始播放</button></view>方法实现 startPlay() { const innerAudioContext uni.createInnerAudioContext();innerAudioContext.src /static/sounds/oqc.mp3;innerAudioContex…...

在Facebook运营中使用住宅IP的重要性

在当前社交媒体的浪潮中&#xff0c;Facebook作为全球最大的社交网络之一&#xff0c;吸引了数以亿计的用户。为了在这一平台上实现有效的运营和推广&#xff0c;越来越多的博主和营销人员正在寻求最佳的养号策略。其中&#xff0c;IP地址的选择显得尤为重要&#xff0c;尤其是…...

EJB项目如何升级SpringCloud

记录某金融机构老项目重构升级为微服务过程1 如何从EJB架构拆分微服务 这个非常有趣的过程&#xff0c;整个过程耗时大致接近半年时光&#xff0c;需要考虑到重构升级保留原来的业务线&#xff0c;而且还要考虑后续的维护成本&#xff0c;保留现有的数据库表结构&#xff0c;…...

HTTPS 协议原理

一.HTTPS的定义 大家在刚开始学习的时候是不是也是非常好奇HTTP与HTTPS之间有什么区别和联系&#xff0c;两者都是应用层协议&#xff0c;而HTTPS是在HTTP的基础上引入了加密层&#xff0c;从而将HTTP的明文传输进行加密&#xff0c;保障数据的安全性 二.加密与解密 定义&#…...

Vxe UI 表格行编辑(默认不显示编辑框,点击后可编辑)

效果: HTML代码:(type"integer"为这个,是限制只能输入正整数或负整数,英文和汉字自动转成0) <vxe-tableshow-overflowkeep-sourcev-loading"loading":data"ruleList"ref"Table":row-config"{isHover: true}"height"…...

移远通信闪耀2024香港秋灯展,以丰富的Matter产品及方案推动智能家居产业发展

10月27-30日&#xff0c;2024香港国际秋季灯饰展在香港会议展览中心盛大开展。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信再次亮相&#xff0c;并重点展示了旗下支持Matter协议以及亚马逊ACK ( Alexa Connect Kit ) SDK for Matter方案的Wi-Fi模组、低功耗蓝…...

爬虫利器playwright

是什么 它是微软在 2020 年初开源的新一代自动化测试工具&#xff0c;其功能和 selenium 类似&#xff0c;都可以驱动浏览器进行各种自动化操作。还可以录制脚本 案列-01 运行之后我们用它自动打开的谷歌浏览器&#xff0c;打开百度&#xff0c;输入漂亮小姐姐并查找&#x…...

着色器的认识

知识了解&#xff1a; 着色器&#xff1a; 顶点着色器: 用来描述顶点的特性,如位置、颜色等&#xff0c;其中&#xff0c;顶点&#xff1a;是指二维或三维空间中的一个点比如交点或者端点。 片元着色器&#xff1a;用来进行逐片元处理操作&#xff0c;比如光照、颜色叠加等&…...

科技的成就(六十四)

591、《传奇》开始公开测试 "2001 年 9 月&#xff0c;《传奇》开始公开测试。《传奇》&#xff08;全称《热血传奇》&#xff09;是由韩国 WeMade 娱乐开发制作的大型多人在线角色扮演游戏&#xff0c;由 Delphi 编写。盛大网络于2001 年获得该游戏在中国的代理权。《传奇…...

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等...

全文链接&#xff1a;https://tecdat.cn/?p38026 分析师&#xff1a;Fanghui Shao 在当今金融领域&#xff0c;风险管控至关重要。无论是汽车贷款违约预测、银行挖掘潜在贷款客户&#xff0c;还是信贷风控模型的构建&#xff0c;以及基于决策树的银行信贷风险预警&#xff0c;…...

〈壮志凌云:独行侠〉中的超高音速战机

电影《壮志凌云&#xff1a;独行侠》中使用的黑星&#xff08;Darkstar&#xff09;高超音速概念战机模型&#xff0c;虽然看起来像是科幻电影里的产物&#xff0c;但这架飞机实际上是由洛克希德马丁公司的臭鼬工厂&#xff08;Skunk Works&#xff09;设计&#xff0c;这是一家…...

k8s集群 ceph rbd 存储动态扩容

k8s 集群 rbd 扩容有两种方法&#xff0c;如下所示 通过StorageClass自动扩容 # kubectl get sc csi-rbd-sc -oyaml|grep allowVolumeExpansion allowVolumeExpansion: true如果搜索有如上字段&#xff0c;说明是可以自动扩容的&#xff0c;修改对应要扩容的 PVC容量&#xf…...

C语言笔记(指针题目)例题+图解

本文分为两部分 &#xff0c;第一部分为数组、字符串、字符指针在sizeof和strlen中的辨析&#xff0c;第二部分是一些笔试题目。若有错误&#xff0c;请批评指正。 目录 1.第一部分 1.1.数组名的使用 1.1.1一维整型数组在sizeof中的使用 1.1.2一维字符数组在sizeof中的使用…...

从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)

从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09; 文章目录 从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09;一、前言二、vue项目部署前配置1、vite.config.js 增加…...

[OceanBase-不止于记录]:揭秘双引擎战略,共探AI时代数据架构未来

前言 又到了一年一度大家最爱的探会文章&#xff0c;非常荣幸收到OceanBase官方的邀请参加2024 OceanBase 年度发布会&#xff0c;作为一个经常参加线下探会的博主&#xff0c;每一次体验都有所不同&#xff0c;每一次新技术的突破都让人感到无比兴奋。同时&#xff0c;作为数…...

项目:抽奖系统

文章目录 1. 项目&#xff1a;抽奖系统 1. 项目&#xff1a;抽奖系统 from faker import Fakerfk Faker(localezh_CN)name_list [] for i in range(100):name_list.append(fk.name()) print(name_list)import randomclass MyFrame(wx.Frame):def __init__(self):wx.Frame.__…...

synchronized进阶原理

synchronized进阶原理 1.轻量级锁 轻量级锁的使用场景:如果一个对象虽然有多个线程访问,但多线程访问的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化(如果出现竞争,操作系统会将轻量级锁升级为重量级锁)。轻量级锁对使用者是透明的(由操作系统控制),即语法仍是s…...

C++,STL 052(24.10.29)

内容 1.对map容器的大小进行操作。 2.map容器的交换操作。 运行代码 #include <iostream> #include <map>using namespace std;void printMap(map<int, int> &m) {for (map<int, int>::iterator it m.begin(); it ! m.end(); it){cout <<…...

网站健设推广产品多少钱/山东百搜科技有限公司

0、首先得理解MP3格式文件的结构 简单的就是 MP3 文件大体分为三部分&#xff1a;TAG_V2(ID3V2)&#xff0c;音频数据&#xff0c;TAG_V1(ID3V1) 参考此博客&#xff1a;点击打开链接 ID3V1的结构是&#xff1a; 表1&#xff1a;ID3V1结构 ------------------------------…...

做视频类型的网站/广州:推动优化防控措施落地

由于公司要做整套电子商务解决方案&#xff0c;考虑到平台的通用性&#xff08;其中b2b、b2c、o2o、小程序&#xff0c;都离不开基础平台&#xff09;&#xff0c;优先给公司规划&#xff1a; 平台管理端&#xff08;统一管理&#xff0c;包含自营店铺&#xff09;、商家管理端…...

wordpress.en/精准营销理论

目录 Numpy 加载图像到内存映射区 准备工作 具体步骤 小结 Numpy 合并图像 准备工作 具体步骤...

深圳知名网站建设平台/网络营销的优势有哪些

将汇编翻译成C了&#xff0c; 累死了。。。应项目要求靠着一个汇编写的自定义协议源代码 硬是用C 实现。。。头大了。。// 模块功能&#xff1a; 实现STM32与PIC16F57串行通信。#include "PIC16F57_CM.h"#include "Delay.h"/*****************************…...

360网站怎么建设/搜索引擎入口大全

一 应用场景描述现在我需要向50数量的服务器分发Logstash新版本的rpm包&#xff0c;大概220MB左右&#xff0c;直接使用Ansible的copy命令进行传输&#xff0c;命令如下&#xff1a;ansible all -m copy -a "src/opt/software/logstash/logstash-agent-2.3.3-fb.centos6.…...

Dedecms 手机网站示例/百度的广告推广需要多少费用

几种破解mysql root密码的几种方法: 方法一 使用phpmyadmin&#xff0c;这是最简单的了&#xff0c;修改mysql库的user表&#xff0c;不过别忘了使用PASSWORD函数。 方法二 使用mysqladmin&#xff0c;这是前面声明的一个特例。 mysqladmin -u root -p password mypasswd 输入。…...