编辑器拓展
https://blog.csdn.net/zxl321365712/article/details/80080586
蛮牛上一个详细的博客
http://www.manew.com/thread-90330-1-1.html
siki关于编辑器拓展的视频教程(免费)
http://www.sikiedu.com/my/course/47
官方教程
https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu-items
API界面
https://docs.unity3d.com/ScriptReference/MenuItem.html
编辑器脚本都在Editor下,在打包时不会包含
编辑器特性位于unityEditor命名空间下
添加菜单按钮
[MenuItem("Tools/test")]//在菜单上显示命令
public static void Test()//点击该命令后可以执行这个方法,私有也可访问
{
Debug.Log("Test Function is work");
}
public MenuItem(string itemName, bool isValidateFunction, int priority);
itemName路径:每个/代表一级菜单
isValidateFunction是否为可用性检查,在后面介绍。
priority优先级,越小越靠上,当优先级相差大于10以上时会分组
路径重复时,后添加的菜单会覆盖先添加的。
系统内置的功能也会被覆盖。
Game Object中,优先级小于50(不包括)的会显示在hierarchy中。
component菜单下的内容必须继承monobehaviour,因此需要使用AddComponentMenu添加,其他使用方法相似
允许加空格,空格后可设置快捷键,不可重复,如"Tools/test4 _q"
特殊快捷键如下:
* _ – 无
* % – CTRL on Windows / CMD on OSX
* # – Shift
* & – Alt
* LEFT/RIGHT/UP/DOWN – Arrow keys
* F1…F12 – F keys
* HOME, END, PGUP, PGDN
给脚本,组件添加右键菜单:
路径用CONTEXT/[组件名]/[其他]
获取点击的组件:方法添加MenuCommand类参数,其中context字段即为我们右键打开菜单的那个物体(或者组件)。建议存成对应类型再使用,可以用强制转换,或者as。用as转换,失败时会返回空,而强制会报错。
static public void RigidbodyTools(MenuCommand cmd)
{
Rigidbody rigidbody = cmd.context as Rigidbody;
}
selection类
这个是unity用来获取当前选中的物体的。可以得到用户当前选中的物体。常用内容:
activeObject//当前选中的那个物体
Objects//所有选中的物体,返回一个数组
activeGameObject//当前选中的物体(一个,多个时为第一个)(包括预制体,不可改变物体)
gameObjects//所有选中的物体,返回一个数组,(包括预制体,不可改变物体)
activeTransform//当前选中的物体的transform
transforms//选中的物体中最高层级
添加可撤销操作:
编辑器脚本中大多数操作不会注册到栈中,不能使用
使用Undo,操作的同时会加入栈中,使用ctrl+z可撤销。
[MenuItem("Tools/myDelete")]
static void myDelete()
{
foreach(Object o in Selection.gameObjects)
{
//Object.DestroyImmediate(o);
Undo.DestroyObjectImmediate(o);
}
}
(编辑器脚本只能使用DestroyImmediate)
相关操作:
DestroyObjectImmediate//可撤销的删除物体
RecordObject//记录之后物体的改变
RegisterCreatedObjectUndo//记录物体创建
控制菜单的可用性
添加一个路径同名的MenuItem,第二个参数isValidateFunction设为true,并设置一个bool型的方法。
当显示菜单时会检查这个方法,当返回false时不可用,true时可用。
建议方法后加validate(验证)作为验证方法。
当在hierarchy中添加菜单时,可用性都为真,但是返回假时不会执行方法。(是bug吧)
在组件上直接添加菜单选项
可以使用ContextMenu可以在通常的组件中添加菜单选项。
不需要在Editor中,不用引用UnityEditor,方法为非静态。
[ContextMenu("Renew")]
void Renew()
{
Debug.Log("Renew work");
}
给字段添加菜单
在字段前加[ContextMenuItem(string name, string function)]标签
第一个参数为菜单名,第二个是调用的方法。这个方法必须声明(可为私有)。
[ContextMenuItem("add value", "AddValue")]
public int value=0;
void AddValue()
{
value += 10;
}
创建向导面板
首先创建一个面板类,在Editor文件夹下
该类继承ScriptableWizard
使用ScriptableWizard.DisplayWizard
T:面板类的类型
title:面板的标题
一般将创建面板也放在面板类下方便查找,同时由于面板类继承ScriptableWizard,创建不用ScriptableWizard.DisplayWizard,直接DisplayWizard即可。
面板类的公有方法会显示在面板上,就像组件中一样。
using UnityEditor;
public class ValueChangeWizard : ScriptableWizard {
[MenuItem("Tools/ChangeValue", false, 40)]
static void OpenChangeValue(MenuCommand cmd)
{
DisplayWizard
}
//创建面板
public int newValue = 1000;//公有方法会像组件中一样显示
private int score=0;//私有方法不会显示
}
ps:Wizard是巫师的意思
面板类都有一个按钮creat,使用DisplayWizard的第二个参数改变显示名。
有一些默认的方法,自动在按下时调用:
private void OnWizardCreate()
{
}//点击创建按钮调用,调用后默认关闭窗口
private void OnWizardOtherButton()
{
}//点击其他按钮调用
private void OnWizardUpdate()
{
}//打开或向导的值改变时调用
private void OnSelectionChange()
{
}//每当选中物体发生更改时调用
//类似的消息方法还有一些,可以在API中查到。
面板类的提示信息
isValid//按钮是否可用
errorString//错误信息
helpString//帮助信息
createButtonName//creat按钮显示内容
otherButtonName//ortherButton显示内容
显示通知
(EditorWindow.)ShowNotification(GUIContent notification);
参数为一个GUIContent对象,
GUIContent(string text, Texture image, string tooltip);
可以设置文字text,图片image,tooltip
ShowNotification(new GUIContent("ShowNotification", new Texture2D(200,200), "tooltip"));
tooltip,可以作为标签加到字段前,用于设置悬浮时显示的提示信息。
[Tooltip("新的值")]
public int ChangeValue = 10;
没搞懂怎么在消息提示中使用。
编辑器数据保存
EditorPrefs
使用方法与PlayerPrefs相同,不在重复
一些零碎的实用功能
EditorUtility中集成了一些实用的方法,主要是提示,信息框等。
EditorUtility.DisplayProgressBar(string title, string info, float progress);
参数:
title 标题
info 信息
progress 0到1之间的一个值,表示进度。
每当进行一定步骤后,调用这个方法实现进度条。
以下是一个每次点击增加一点进度条的实现。
int count = 0;
private void OnWizardOtherButton()
{
EditorUtility.DisplayProgressBar("title", "info", count/10.0f);
count++;
if (count > 10)
{
EditorUtility.ClearProgressBar();
count = 0;
}
}
创建窗口
使用EditorWindow,与 ScriptableWizard相似,创建时有些许不同。
可以使用OnGUI显示一些内容。
using UnityEditor;
using UnityEngine;
public class MyWindow : EditorWindow
{
[MenuItem("Tools/MyWindow")]
static void ShowMyWindow()
{
MyWindow window = EditorWindow.GetWindow
window.Show();
}
//打开这个窗口的命令
private string name;
private void OnGUI()
{
GUILayout.Label("string");//显示一个字符串
name = GUILayout.TextField(name);//显示一个输入框
}
}
特殊目录位置
下面是一些默认的排序优先级