扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作。

一.添加按钮

1.简单使用MenuItem特性

using UnityEngine;
using UnityEditor; public class Tools
{
[MenuItem("Tools/test")]
static void Test()
{
Debug.Log("test");
}
}

2.路径设置

在方法上添加MenuItem特性,在MenuItem的括号中传入路径字符串参数,路径中使用/进行目录分级。第3个参数priority为选项在目录中的显示顺序,这个值默认是1000。
using UnityEngine;
using UnityEditor; public class Tools
{
//MenuItem的第3个参数priority为当前选项在菜单栏中的显示顺序,数字越大,显示在越下面
//当相邻两个选项的priority值相差大于等于11时,系统将在这两个选项之间添加一条横线进行分组
[MenuItem("Tools/test1",false,2)]
static void Test1()
{
Debug.Log("test1");
} [MenuItem("Tools/test2",false,1)]
static void Test2()
{
Debug.Log("test2");
} [MenuItem("Tools/test3",false,13)]
static void Test3()
{
Debug.Log("test3");
}
}

3.Hierarchy和Project窗口的右键菜单

Hierarchy窗口中右键的菜单实际上是一些复制粘贴等按钮和GameObject目录下第一类的按钮的组合,因此将按钮添加到GameObject菜单下第一类按钮中即可在Hierachy窗口中右键出这个按钮。

Project窗口的右键菜单实际上就是Assets目录,因此将按钮添加到Assets目录下即可在Project窗口中右键出这个按钮。

4.在组件的右键菜单中添加按钮

using UnityEditor;
using UnityEngine; public class PlayerEditor
{
//在组件上的右键菜单中添加按钮路径参数为“CONTEXT/需要添加按钮的组件名称/按钮目录和名称”
[MenuItem("CONTEXT/PlayerHealth/InitHealthAndSpeed")]
static void InitHealthAndSpeed(MenuCommand command)
{
//在按下按钮后,系统自动传递参数MenuCommand,对象的context属性的内容就是当前组件
CompleteProject.PlayerHealth health = command.context as CompleteProject.PlayerHealth;
//获取当前组件后,可以进行修改组件的变量等操作
health.startingHealth = 10000;
health.flashSpeed = 15;
}
}

5.Selection获取选择的游戏物体

using UnityEditor;
using UnityEngine; public class PlayerEditor
{
[MenuItem("Test/showInfo")]
static void InitHealthAndSpeed()
{
Debug.Log(Selection.objects.Length);
}
}

6.按钮快捷键

using UnityEditor;
using UnityEngine; public class PlayerEditor
{
//在路径名称后空格再指定快捷键,这里指定快捷键是T
//一些快捷键例子:_t ==> T
// %t ==> Ctrl+T
// #t ==> Shift+T
// &t ==> Alt+T
[MenuItem("Test/showInfo _t")]
static void InitHealthAndSpeed()
{
Debug.Log(Selection.objects.Length);
}
}

7.按钮的验证方法

using UnityEditor;
using UnityEngine; public class PlayerEditor
{
//按钮的验证方法和按钮方法的菜单路径一致,返回值为bool值,将MenuItem的第二个参数置为true代表这是一个按钮的验证方法
//这个方法判断选中的游戏物体数,如果选中了任意游戏物体才能点击按钮;未选中游戏物体按钮将变为不可点击状态
[MenuItem("Test/showInfo _t",true,11)]
static bool InitHealthAndSpeedValidate()
{
if (Selection.objects.Length > 0)
return true;
else
return false;
} //日志输出选中的游戏物体数目
[MenuItem("Test/showInfo _t",false,11)]
static void InitHealthAndSpeed()
{
Debug.Log(Selection.objects.Length);
}
}

8.为组件添加按钮的另一种方式

使用ContextMenu特性为组件添加按钮,注意这个特性添加在一个具体的方法上方,代表按钮触发这个方法,而这个方法必须是要添加按钮的脚本内的方法,可以理解为直接在脚本中定义按钮。

        //为脚本添加SetColor按钮,按钮触发这个方法改变脚本中flashColour的属性值
[ContextMenu("SetColor")]
void SetColor()
{
flashColour = Color.blue;
}

使用ContextMenuItem特性为脚本的某个属性添加按钮,这个特性自然也就定义在需要添加按钮的属性上方,按钮触发的方法也定义在脚本中。

        //这个特性代表为startingHealth属性添加一个AddHP100按钮,在属性上右键即可看到这个按钮,这个按钮会触发AddHP这个方法
[ContextMenuItem("AddHP100","AddHP")]
public int startingHealth = 100;
        void AddHP()
{
startingHealth += 100;
}

二.添加和使用对话框

1.简单添加对话框

首先创建一个按钮用于弹出对话框。

using UnityEditor;
using UnityEngine; public class PlayerEditor
{
[MenuItem("Tools/CreateWizard")]
static void CreateWizard()
{
//按下按钮后弹出对话框,对话框的标题为“这是对话框”,对话框的内容由ShowDialog这个脚本进行定义
ScriptableWizard.DisplayWizard<ShowDialog>("这是对话框");
}
}

然后定义对话框,对话框需要继承自ScriptableWizard类。

using UnityEditor;

public class ShowDialog : ScriptableWizard
{
public int changeHealthValue = 100;
}

最后保存后在unity中点击按钮就可以看到对话框了。

注意:推荐将按钮的代码写在对话框的类中,结构会更加清晰,方便管理。

2.DisplayWizard方法的参数

using UnityEditor;

public class ShowDialog : ScriptableWizard
{
[MenuItem("Tools/CreateWizard")]
static void CreateWizard()
{
//两个参数都是字符串,第一个参数定义对话框的标题,第二个参数定义右下角确认提交按钮的名称,默认是Create
ScriptableWizard.DisplayWizard<ShowDialog>("这是对话框","Change");
} public int changeHealthValue = 100;

3.在对话框确认提交后触发OnWizardCreate方法

using UnityEditor;
using UnityEngine; public class ShowDialog : ScriptableWizard
{
[MenuItem("Tools/CreateWizard")]
static void CreateWizard()
{
//两个参数都是字符串,第一个参数定义对话框的标题,第二个参数定义右下角确认提交按钮的名称,默认是Create
ScriptableWizard.DisplayWizard<ShowDialog>("这是对话框","Change");
} public int changeHealthValue = 100; //监测对话框确认提交按钮,对话框确认提交后触发
private void OnWizardCreate()
{
GameObject[] gos = Selection.gameObjects;
foreach(GameObject go in gos)
{
go.GetComponent<EnemyHealth>().startingHealth += changeHealthValue;
}
}
}

4.ScriptableWizard类中的其他Message

OnWizardUpdate方法:当打开对话框或对话框中的值发生改变时触发。

OnWizardOtherButton方法:当用户点击others按钮时触发,这个按钮可以通过DisplayWizard方法的第3个参数指定名称,others按钮不会关闭对话框。

三.使用EditorWindow类创建窗口

using UnityEngine;
using UnityEditor; public class ShowWindow : EditorWindow
{
[MenuItem("Window/show mywindow")]
static void ShowMyWindow()
{
ShowWindow window = EditorWindow.GetWindow<ShowWindow>("MyWindow");
window.Show();
} private void OnGUI()
{
GUILayout.Label("我的窗口");
GUILayout.TextField("");
GUILayout.Button("创建");
}
}

												

unity编辑器扩展学习的更多相关文章

  1. Unity编辑器扩展学习 转载

    https://www.xuanyusong.com/archives/category/unity/unity3deditor 1 using UnityEngine; public class T ...

  2. Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

    Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject  Unity编辑器扩展 Chapt ...

  3. Unity编辑器扩展chapter1

    Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...

  4. Unity 编辑器扩展 场景视图内控制对象

    http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...

  5. unity 编辑器扩展简单入门

    unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...

  6. Unity编辑器扩展Texture显示选择框

    学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插 ...

  7. Unity 编辑器扩展

    自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...

  8. Unity3d编辑器扩展学习笔记

    编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...

  9. Unity编辑器扩展

    在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...

随机推荐

  1. 【Android】报错 Please ensure Hyper-V is disabled in Windows Features, or refer to the Intel HAXM 的解决方案

    参考文章 实测华为锐龙本(adm yes)安装Android avd虚拟机教程 环境 Android Studio 3.6; Windows 1909; AMD Ryzen 4800U with Ra ...

  2. LVM 逻辑卷扩容

    当lv空间不够用时,就需要我们对lv进行的扩容. 扩容分两种情况:(lv的有点,支持在线扩容) VG有充足的空间,可直接对LV进行扩容: VG空间不足,需要先对VG进行扩容,然后再对LV进行扩容 这里 ...

  3. win server 2019服务器的iis配置以及网站的简单发布

    1.首先远程连接到服务器 2.打开服务器管理器 3添加角色和功能 4.安装类型:选择基于角色或基于功能的安装  →服务器角色:从服务器池中选择服务器 5.服务器角色选择Web服务器(iis) 6.功能 ...

  4. history附上时间戳,history命令_Linux history命令:查看和执行历史命令

    起因是这样的,一台机器客户反馈连接不上,说没有任何操作.好吧,排查吧. 1.第一步先看网络是否通: 从图中可以看到一开始是一直不通的.然后就通了,问了客户有没操作重启什么的结果说没有任何操作,还让给个 ...

  5. Failed to start ssh.service: Unit not found.

    Failed to start ssh.service: Unit not found. 报错内容: [Centos7@localhost ~]$ service ssh start Redirect ...

  6. Code Review 的几个技巧

    No magic: Explicit not implicit: 覆盖度比深度重要,覆盖度追求100%: 频率比仪式感重要,坐公交蹲厕所打开手机都可以 Review 别人代码,不需要专门组织会议: 粒 ...

  7. MDX学习笔记(整理) MDX语法

    1.1.members和Children的用法. select [Measures].[Internet Sales Count] on columns, [客户].[全名] on rows from ...

  8. (转载)微软数据挖掘算法:Microsoft顺序分析和聚类分析算法(8)

    前言 本篇文章继续我们的微软挖掘系列算法总结,前几篇文章已经将相关的主要算法做了详细的介绍,我为了展示方便,特地的整理了一个目录提纲篇:大数据时代:深入浅出微软数据挖掘算法总结连载,有兴趣的童鞋可以点 ...

  9. 题解 P3833 【[SHOI2012]魔法树】

    题目 直通车 很显然这是个树刨的板子,树上链查询和子树查询 注意: 1.这个点的树根为 0 而不是 1 所以注意读图时点标号 +1 就解决了 2.注意数据范围\(2^{32}\) 然后板子就能过了 n ...

  10. Navicat,Dbeaver,heidiSql,DataGrip数据库连接工具比较

    Navicat,Dbeaver,heidiSql,DataGrip数据库连接工具比较 1.Navicat 2.DBeaver 3.heidiSql 4.DataGrip 1.Navicat Navic ...