1、在菜单栏上增加MenuItem
using UnityEditor;
using UnityEngine;
public class Tools{
[MenuItem("Tools/test",false,10)]//参数1是在菜单栏上的显示路径,参数3是该按钮的显示层级,每个分类的参数相差十倍左右
static void Test(){
Debug.Log("Test");
}
}
2、在组件右键上添加MenuItem
using UnityEditor;
using UnityEngine;
public class Tools{
[MenuItem("CONTEXT/Rigidbody/Clear")] //CONTEXT/组件名/按钮名
static void ClearMassAndGravity(){
Rigidbody rb = cmd.context as Rigidbody;
rb.mass = 0;
rb.useGravity = false;
}
}
3、选中游戏物体,点击自定义的delete按钮删除选中的物体
using UnityEngine;
using UnityEditor;
public class Tools{
[MenuItem("GameObject/MyDelete",false,11)]
static void MyDelete(){
foreach(Object o in Selection.objects){
//GameObject.DestroyImmediate(o); //不可撤销的删除
Undo.DestroyObjectImmediate(0); //可以撤销的删除
}
}
4、给菜单项添加快捷键
using UnityEngine;
using UnityEditor;
public class Tools{
//%=Ctrl #=Shift &=Alt
[MenuItem("MyTools/Test1 _t")] //快捷键为T
static void Test1(){
Debug.Log("Test1");
}
[MenuItem("MyTools/Test1 %t")] //快捷键为Ctrl + t
static void Test1(){
Debug.Log("Test1");
}
[MenuItem("MyTools/Test1 #t")] //快捷键为Shift + t
static void Test1(){
Debug.Log("Test1");
}
}
5、控制菜单项是否可用(是否置灰)
[MenuItem("Copy/CopyImage #e",false,1)] //
static void CopyImage(){
Debug.Log("Image复制");
compoent = Selection.activeGameObject.GetComponent<Image>();
}
[MenuItem("Copy/CopyImage #e",true,1)] //参数2为true
static bool CopyValidate(){
if (Selection.activeGameObject == null) {
return false;
} else {
return true;
}
}
6、直接在组件脚本下给组件添加右键菜单项按钮
[ContextMenu("setColor")] //参数1是方法名,不需要引入UnityEditor
7、直接在组件脚本下给某个变量(属性)添加右键菜单项按钮
[ContextMenuItem("add hp","AddHP")] //参数1按钮名字、参数2方法名 不需要引入UnityEditor,不需要写在方法前面
8、对话框
using UnityEngine;
using UnityEditor;
//对话框类
public class Panel1:ScriptableWizard{
[MenuItem("Tools/CreateWizard")] //菜单按钮
static void CreateWizard(){ //创建对话框对象的方法,可以写在其他地方
ScriptableWizard:DisplayWizard<Panel1>("面板","按钮名字","OtherButton");//按钮名字默认叫create
}
public int Value1 = 10;
//create按钮click事件 会关闭对话框
void OnWizardCreate(){
Debug.Log("Create Click");
GameObject[] enemyPrefabs = Selection.gameObjects;//获得选中的所有游戏对象或者Prefab
EditorUtility.DisplayProgressBar("进度","0/" + ememyPrefabs.Length + "完成修改" , 0);//初始化进度条
int count = 0;
foreach (GameObject go in ememyPrefabs){
Undo.RecordObject(hp,"HP change"); //可以让下面的更改变得可以撤销(Ctrl+Z)
EnemyHeath hp = go.GetComponet<EnemyHeath>(); //获得敌人组件
hp.startingHeath += Value1; //更改组件数值
count++;
//更新进度条信息
EditorUtility.DisplayProgressBar("进度",count + "/" + ememyPrefabs.Length + "完成修改" , count / (float)ememyPrefabs.Length);
}
EditorUtility.ClearProgressBar();
}
//当窗口被创建的时候调用
void OnEnable(){
Value1 = EditorPrefs.GetInt("Panel1.Value1",Value1);//使用上次窗口的值,获取键值为Panel1.Value1的变量,如果没有则返回Value1的值
}
//OtherButton按钮的click事件 不会关闭对话框
void OnWizardOtherButton(){
Debug.Log("Other button click");
GameObject[] enemyPrefabs = Selection.gameObjects;//获得选中的所有游戏对象或者Prefab
foreach (GameObject go in ememyPrefabs){
Undo.RecordObject(hp,"HP change"); //可以让下面的更改变得可以撤销(Ctrl+Z)
EnemyHeath hp = go.GetComponet<EnemyHeath>(); //获得敌人组件
hp.startingHeath += Value1; //更改组件数值
}
ShowNotification(new GUIContent("有"+Selection.gameObjects.Length+"个物体被改变了")); //在对话框内提示一个信息,几秒后消失
}
//当对话框弹出或者里面内容有改变的时候会调用
void OnWizardUpdate(){
Debug.Log("Update");
helpString = "";
errorString = "";
if(Selection.gameObjects.Length>0){
helpString = "你当前选中了"+Selection.gameObjects.Length+"个gameObject"; //helpString为基类变量,用于显示在窗口上
}
else
{
errorString = "请选中一个gameObject"; //errorString为基类变量,用于显示在窗口上
}
EditorPrefs.SetInt("Panel1.Value1",Value1); //记录当前的值,以便于下次打开窗口使用
}
//当选择的gameObject发生改变的时候会调用
void OnSelectionChange(){
OnWizardUpdate();
}
}
9、创建长久存在的对话框
using System.Collentions;
using System.Collentions.Generic;
using UnityEngine;
using UnityEditor;
//长久存在的对话框类
public class MyWindow : EditorWindow{
[MenuItem("Windows/Display MyWindow")]
static void DisplayerMyWindow(){
MyWindow myWindow = EditorWindow.GetWindow<MyWindow>();//获取窗口对象
myWindow.Show();
}
private string name = "";
void OnGUI(){
GUILayout.Label("这是我的窗口");
name = GUILayout.TextField(name);
if(GUILayout.Button("创建")){
GameObject go = new GameObject(name); // 创建游戏物体
Undo.RegisterCreateObjectUndo(go , "create gameObject"); //注册到操作记录,就可以进行撤销
}
}
}