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学院,仅作学习交流使用,不作任何商业用途,吃水不忘打井人,谨遵教诲 编辑器扩展内容实在是太多太多了(本篇就有五千字) 所以分为两个篇章而且只用一些常用api举例,…...
Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)
一、什么是 SPI SPI 全名 Service Provider interface,翻译过来就是“服务提供接口”。基本效果是,申明一个接口,然后通过配置获取它的实现,进而实现动态扩展。 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:17skywalking:10.1.0apache-skywalking-java-agent:9.3.0ElasticSearch : 8.8.2 问题描述 maximum query complexity exceeded 3336 > 3000 最大查询复杂度超过3336>3000 可能原因 查询条件过于复…...
开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码
大家好,我是一颗甜苞谷,今天分享一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码。 介绍 当前系统集成了ChatGPT的聊天应用,不仅提供了基本的即时通讯功能,还引入了先进的AI技术&#x…...
开发了一个成人学位英语助考微信小程序
微信小程序名称:石榴英语 全称:石榴英语真题助手 功能定位 北京成人学士学位英语辅助学习工具,包含记高频单词,高频词组,专项练习,模拟考试等功能。 开发背景 个人工作需要提高学习英文水平ÿ…...
LeetCode16:最接近的三数之和
原题地址:. - 力扣(LeetCode) 题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1…...
VisualStudio2022配置2D图形库SFML
文章目录 1. 下载安装SFML库2. 创建C项目并配置SFML配置include目录和库目录链接SFML库配置动态链接库 3. 测试 1. 下载安装SFML库 SFML(Simple and Fast Multimedia Library)C库,适合2D游戏和图形界面,提供了以下模块࿱…...
「Mac畅玩鸿蒙与硬件4」鸿蒙开发环境配置篇4 - DevEco Studio 高效使用技巧
本篇将进一步介绍如何在 DevEco Studio 中高效使用各种功能,通过掌握快捷键、代码补全、调试工具等,帮助开发者在鸿蒙应用开发中大幅提升工作效率。 关键词 DevEco Studio快捷键代码补全调试工具项目导航 一、快捷键与高效操作 快捷键是提升开发效率的…...
构建生产级的 RAG 系统
对 RAG 应用程序进行原型设计很容易,但要使其高性能、健壮且可扩展到大型知识语料库却很困难。 本指南包含各种提示和技巧,以提高 RAG 工作流程的性能。我们首先概述一些通用技术 - 它们按照简单到复杂的顺序进行排列。然后,我们将更深入地研…...
完全透彻了解一个asp.net core MVC项目模板2
这是《完全透彻了解一个asp.net core MVC项目模板》的第二篇,如果你直接进入了本篇博文而不知道上下文,请先阅读《完全透彻了解一个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的重要性
在当前社交媒体的浪潮中,Facebook作为全球最大的社交网络之一,吸引了数以亿计的用户。为了在这一平台上实现有效的运营和推广,越来越多的博主和营销人员正在寻求最佳的养号策略。其中,IP地址的选择显得尤为重要,尤其是…...
EJB项目如何升级SpringCloud
记录某金融机构老项目重构升级为微服务过程1 如何从EJB架构拆分微服务 这个非常有趣的过程,整个过程耗时大致接近半年时光,需要考虑到重构升级保留原来的业务线,而且还要考虑后续的维护成本,保留现有的数据库表结构,…...
HTTPS 协议原理
一.HTTPS的定义 大家在刚开始学习的时候是不是也是非常好奇HTTP与HTTPS之间有什么区别和联系,两者都是应用层协议,而HTTPS是在HTTP的基础上引入了加密层,从而将HTTP的明文传输进行加密,保障数据的安全性 二.加密与解密 定义&#…...
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日,2024香港国际秋季灯饰展在香港会议展览中心盛大开展。 作为全球领先的物联网整体解决方案供应商,移远通信再次亮相,并重点展示了旗下支持Matter协议以及亚马逊ACK ( Alexa Connect Kit ) SDK for Matter方案的Wi-Fi模组、低功耗蓝…...
爬虫利器playwright
是什么 它是微软在 2020 年初开源的新一代自动化测试工具,其功能和 selenium 类似,都可以驱动浏览器进行各种自动化操作。还可以录制脚本 案列-01 运行之后我们用它自动打开的谷歌浏览器,打开百度,输入漂亮小姐姐并查找&#x…...
着色器的认识
知识了解: 着色器: 顶点着色器: 用来描述顶点的特性,如位置、颜色等,其中,顶点:是指二维或三维空间中的一个点比如交点或者端点。 片元着色器:用来进行逐片元处理操作,比如光照、颜色叠加等&…...
科技的成就(六十四)
591、《传奇》开始公开测试 "2001 年 9 月,《传奇》开始公开测试。《传奇》(全称《热血传奇》)是由韩国 WeMade 娱乐开发制作的大型多人在线角色扮演游戏,由 Delphi 编写。盛大网络于2001 年获得该游戏在中国的代理权。《传奇…...
银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等...
全文链接:https://tecdat.cn/?p38026 分析师:Fanghui Shao 在当今金融领域,风险管控至关重要。无论是汽车贷款违约预测、银行挖掘潜在贷款客户,还是信贷风控模型的构建,以及基于决策树的银行信贷风险预警,…...
〈壮志凌云:独行侠〉中的超高音速战机
电影《壮志凌云:独行侠》中使用的黑星(Darkstar)高超音速概念战机模型,虽然看起来像是科幻电影里的产物,但这架飞机实际上是由洛克希德马丁公司的臭鼬工厂(Skunk Works)设计,这是一家…...
k8s集群 ceph rbd 存储动态扩容
k8s 集群 rbd 扩容有两种方法,如下所示 通过StorageClass自动扩容 # kubectl get sc csi-rbd-sc -oyaml|grep allowVolumeExpansion allowVolumeExpansion: true如果搜索有如上字段,说明是可以自动扩容的,修改对应要扩容的 PVC容量…...
C语言笔记(指针题目)例题+图解
本文分为两部分 ,第一部分为数组、字符串、字符指针在sizeof和strlen中的辨析,第二部分是一些笔试题目。若有错误,请批评指正。 目录 1.第一部分 1.1.数组名的使用 1.1.1一维整型数组在sizeof中的使用 1.1.2一维字符数组在sizeof中的使用…...
从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)
从零开始的 vue项目部署到服务器详细步骤(vue项目build打包nginx部署配置ssl证书) 文章目录 从零开始的 vue项目部署到服务器详细步骤(vue项目build打包nginx部署配置ssl证书)一、前言二、vue项目部署前配置1、vite.config.js 增加…...
[OceanBase-不止于记录]:揭秘双引擎战略,共探AI时代数据架构未来
前言 又到了一年一度大家最爱的探会文章,非常荣幸收到OceanBase官方的邀请参加2024 OceanBase 年度发布会,作为一个经常参加线下探会的博主,每一次体验都有所不同,每一次新技术的突破都让人感到无比兴奋。同时,作为数…...
项目:抽奖系统
文章目录 1. 项目:抽奖系统 1. 项目:抽奖系统 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 文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1) 参考此博客:点击打开链接 ID3V1的结构是: 表1:ID3V1结构 ------------------------------…...
做视频类型的网站/广州:推动优化防控措施落地
由于公司要做整套电子商务解决方案,考虑到平台的通用性(其中b2b、b2c、o2o、小程序,都离不开基础平台),优先给公司规划: 平台管理端(统一管理,包含自营店铺)、商家管理端…...
wordpress.en/精准营销理论
目录 Numpy 加载图像到内存映射区 准备工作 具体步骤 小结 Numpy 合并图像 准备工作 具体步骤...
深圳知名网站建设平台/网络营销的优势有哪些
将汇编翻译成C了, 累死了。。。应项目要求靠着一个汇编写的自定义协议源代码 硬是用C 实现。。。头大了。。// 模块功能: 实现STM32与PIC16F57串行通信。#include "PIC16F57_CM.h"#include "Delay.h"/*****************************…...
360网站怎么建设/搜索引擎入口大全
一 应用场景描述现在我需要向50数量的服务器分发Logstash新版本的rpm包,大概220MB左右,直接使用Ansible的copy命令进行传输,命令如下:ansible all -m copy -a "src/opt/software/logstash/logstash-agent-2.3.3-fb.centos6.…...
Dedecms 手机网站示例/百度的广告推广需要多少费用
几种破解mysql root密码的几种方法: 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWORD函数。 方法二 使用mysqladmin,这是前面声明的一个特例。 mysqladmin -u root -p password mypasswd 输入。…...