目录
6.编写可以撤销的删除操作(使用Undo.DestroyObjectImmediate()方法)
7.给菜单项添加快捷键(%=ctrl, #=shift, &=alt)
8.控制菜单项是否启用的功能(将MenuItem()的第二个参数设为true)
9.关于ContextMenu和ContextMenuItem的使用
13.创建OtherButton按钮并监听按钮点击(OnWizardOtherButton())
14.使用ShowNotification显示提示信息(ShowNotification())
16.显示进度条( EditorUtility.DisplayProgressBar())
1.使用MenuItem添加菜单栏按钮
using UnityEditor;
using UnityEngine;
public class Tools {
[MenuItem ("Tools/test")]
static void Test()
{
Debug.Log("Test");
}
}
2.关于MenuItem的路径设置和显示的先后顺序设置
- 路径设置
using UnityEditor;
using UnityEngine;
public class Tools
{
[MenuItem("Tools/mytest/test1")]
static void Test1()
{
Debug.Log("Test1");
}
[MenuItem("Tools/mytest/test2")]
static void Test2()
{
Debug.Log("Test2");
}
}
- 显示的先后顺序设置
using UnityEditor;
using UnityEngine;
public class Tools {
[MenuItem ("Tools/test1",false ,1)]
static void Test1()
{
Debug.Log("Test1");
}
[MenuItem("Tools/test2",false ,2)]
static void Test2()
{
Debug.Log("Test2");
}
[MenuItem("Tools/test3",false ,0)]
static void Test3()
{
Debug.Log("Test3");
}
}
可以看到Tools菜单栏下面的菜单按钮的顺序是test3-test1-test2,现在我想让test3和test1成为一组,即想在test1和test2之间插入一根横线,我们只需要让相邻的两个菜单按钮(这里是test1和test2)之间的priority相差11(或11以上)即可,如下:
using UnityEditor;
using UnityEngine;
public class Tools {
[MenuItem ("Tools/test1",false ,13)]
static void Test1()
{
Debug.Log("Test1");
}
[MenuItem("Tools/test2",false ,2)]
static void Test2()
{
Debug.Log("Test2");
}
[MenuItem("Tools/test3",false ,0)]
static void Test3()
{
Debug.Log("Test3");
}
}
- GameObject菜单栏下显示test4,test5;Hierarchy下右键弹出框中显示test4:
using UnityEditor;
using UnityEngine;
public class Tools {
[MenuItem("GameObject/test4", false, 0)]
static void Test4()
{
Debug.Log("Test4");
}
[MenuItem("GameObject/test5")]
static void Test5()
{
Debug.Log("Test5");
}
}
- Assets菜单栏下显示mytest6,Project下右键弹出框显示mytest6:
using UnityEditor;
using UnityEngine;
public class Tools {
[MenuItem("Assets/mytest6")]
static void Test6()
{
Debug.Log("Test6");
}
}
3.给组件的右键菜单栏添加按钮(需要加CONTEXT)
using UnityEditor;
using UnityEngine;
public class CubeEditor{
[MenuItem ("CONTEXT/Cube/init")]//CONTEXT 组件名 按钮名
static void Init()
{
Debug.Log("Init");
}
}
4.关于MenuCommand的使用
- 更改GameObject_Cube的Cube组件里的speed为100
using UnityEditor;
using UnityEngine;
public class CubeEditor{
[MenuItem ("CONTEXT/Cube/init")]
static void Init(MenuCommand cmd)
{
Debug.Log(cmd.context.GetType().FullName);//Cube
Cube cube = cmd.context as Cube;
cube.speed = 100;
Debug.Log("Init");
}
}
- 更改GameObject_Cube的Rigidbody组件里的Mass为10,Use Gravity取消勾选
using UnityEditor;
using UnityEngine;
public class CubeEditor{
[MenuItem ("CONTEXT/Rigidbody/clear")]
static void Init(MenuCommand cmd)
{
Rigidbody rg = cmd.context as Rigidbody;
rg.mass = 10;
rg.useGravity = false;
}
}
5.使用Selection获取选择的游戏物体
using UnityEditor;
using UnityEngine;
public class Tools
{
[MenuItem("Tools/mytest")]
static void Test()
{
Debug .Log(Selection.activeGameObject.name);//是我们选择的第一个游戏物体
Debug.Log(Selection.objects.Length);
}
}
6.编写可以撤销的删除操作(使用Undo.DestroyObjectImmediate()方法)
using UnityEditor;
using UnityEngine;
public class Tools
{
[MenuItem("GameObject/my delete",false ,0)]
static void Test()
{
foreach (Object o in Selection .objects)
{
Undo.DestroyObjectImmediate(o);//按Ctrl+Z可以撤销刚才的删除。推荐使用
//GameObject.DestroyImmediate(o);按Ctrl+Z不可以撤销刚才的删除
}
}
}
7.给菜单项添加快捷键(%=ctrl, #=shift, &=alt)
using UnityEditor;
using UnityEngine;
public class Tools
{
//%=ctrl #=shift &=alt
[MenuItem("tools/test1 %q")]
static void Test1()
{
Debug.Log("test1");
}
[MenuItem("tools/test2 _t")]
static void Test2()
{
Debug.Log("test2");
}
}
8.控制菜单项是否启用的功能(将MenuItem()的第二个参数设为true)
using UnityEditor;
using UnityEngine;
public class Tools
{
[MenuItem("GameObject/my delete", true , 0)]
static bool MyDeleteValidate()
{
if (Selection.objects.Length > 0)
return true;
else
return false;
}
[MenuItem("GameObject/my delete", false, 0)]
static void MyDelete()
{
foreach (Object o in Selection.objects)
{
Undo.DestroyObjectImmediate(o);//按Ctrl+Z可以撤销刚才的删除。推荐使用
//GameObject.DestroyImmediate(o);按Ctrl+Z不可以撤销刚才的删除
}
}
}
9.关于ContextMenu和ContextMenuItem的使用
- ContextMenu(需要UnityEditor命名空间)
using UnityEditor;
using UnityEngine;
public class Cube : MonoBehaviour {
public float speed;
[ContextMenu("setSpeed")]
void Init(MenuCommand cmd)
{
speed = 200;
}
}
- ContextMenuItem(不需要UnityEditor命名空间)
using UnityEngine;
public class Cube : MonoBehaviour {
[ContextMenuItem("AddSpeed","AddSpeed")]
public float speed;
void AddSpeed()
{
speed += 10;
}
}
10.创建对话框
using UnityEditor;
public class EnemyChange : ScriptableWizard {
[MenuItem("myTools/CreateWizard")]
static void CreateWizard()
{
DisplayWizard<EnemyChange>("统一修改敌人","修改");
}
}
点击myTools-CreateWizard,弹出“统一修改敌人”对话框:
11.兼容按钮点击统一修改字段
using UnityEngine;
using UnityEditor;
public class EnemyChange : ScriptableWizard {
[MenuItem("myTools/CreateWizard")]
static void CreateWizard()
{
DisplayWizard<EnemyChange>("统一修改敌人","修改");
}
public int changeSpeed = 10;
private void OnWizardCreate()//检测“修改”按钮的触发
{
Debug.Log("click");
GameObject[] gos = Selection.gameObjects;
foreach (GameObject go in gos)
{
gameobject_hp hp = go.GetComponent<gameobject_hp>();
Undo.RecordObject(hp, "撤销更改");//按CTRL+Z可以返回上一步
hp.Hp += 10;
}
}
}
同时选中GameObjective-Cube和GameObjective-Sphere,点击【myTools】-【CreateWizard】-【修改】后,我们会发现它们的共同组件GameObjective-hp里的Hp属性从100变成了110。此时若再按Ctrl+z,则会从110变成100:
12.显示提示框的帮助信息和错误信息
using UnityEngine;
using UnityEditor;
public class EnemyChange : ScriptableWizard {
[MenuItem("myTools/CreateWizard")]
static void CreateWizard()
{
DisplayWizard<EnemyChange>("统一修改敌人","修改");
}
public int changeSpeed = 10;
private void OnWizardCreate()//检测“修改”按钮的触发
{
GameObject[] gos = Selection.gameObjects;
foreach (GameObject go in gos)
{
gameobject_hp hp = go.GetComponent<gameobject_hp>();
Undo.RecordObject(hp, "撤销更改");
hp.Hp += 10;
}
}
private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
{
errorString = null;
helpString = null;
if(Selection.gameObjects .Length > 0)
{
helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
}else
{
errorString = "请至少选择一个物体";
}
}
private void OnSelectionChange()
{
OnWizardUpdate();
}
}
13.创建OtherButton按钮并监听按钮点击(OnWizardOtherButton())
using UnityEngine;
using UnityEditor;
public class EnemyChange : ScriptableWizard {
[MenuItem("myTools/CreateWizard")]
static void CreateWizard()
{
DisplayWizard<EnemyChange>("统一修改敌人","修改并关闭","修改");
}
public int changeSpeed = 10;
private void OnWizardCreate()//检测“修改并关闭”按钮的触发
{
GameObject[] gos = Selection.gameObjects;
foreach (GameObject go in gos)
{
gameobject_hp hp = go.GetComponent<gameobject_hp>();
Undo.RecordObject(hp, "撤销更改");
hp.Hp += 10;
}
}
private void OnWizardOtherButton()//检测“修改”按钮的触发
{
OnWizardCreate();
}
private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
{
errorString = null;
helpString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
}
else
{
errorString = "请至少选择一个物体";
}
}
private void OnSelectionChange()
{
OnWizardUpdate();
}
}
14.使用ShowNotification显示提示信息(ShowNotification())
using UnityEngine;
using UnityEditor;
public class EnemyChange : ScriptableWizard {
[MenuItem("myTools/CreateWizard")]
static void CreateWizard()
{
DisplayWizard<EnemyChange>("统一修改敌人","修改并关闭","修改");
}
public int changeSpeed = 10;
private void OnWizardCreate()//检测“修改并关闭”按钮的触发
{
GameObject[] gos = Selection.gameObjects;
foreach (GameObject go in gos)
{
gameobject_hp hp = go.GetComponent<gameobject_hp>();
Undo.RecordObject(hp, "撤销更改");
hp.Hp += 10;
ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体的值被修改了"));
}
}
private void OnWizardOtherButton()//检测“修改”按钮的触发
{
OnWizardCreate();
}
private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
{
errorString = null;
helpString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
}
else
{
errorString = "请至少选择一个物体";
}
}
private void OnSelectionChange()
{
OnWizardUpdate();
}
}
15.使用EditorPrefs函数保存数据
using UnityEngine;
using UnityEditor;
public class EnemyChange : ScriptableWizard {
[MenuItem("myTools/CreateWizard")]
static void CreateWizard()
{
DisplayWizard<EnemyChange>("统一修改敌人","修改并关闭","修改");
}
public int changeSpeed = 10;
private void OnEnable()
{
changeSpeed = EditorPrefs.GetInt("EditSpeed", changeSpeed);
}
private void OnWizardCreate()//检测“修改并关闭”按钮的触发
{
GameObject[] gos = Selection.gameObjects;
foreach (GameObject go in gos)
{
gameobject_hp hp = go.GetComponent<gameobject_hp>();
Undo.RecordObject(hp, "撤销更改");
hp.Hp += 10;
ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体的值被修改了"));
}
}
private void OnWizardOtherButton()//检测“修改”按钮的触发
{
OnWizardCreate();
}
private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
{
errorString = null;
helpString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
}
else
{
errorString = "请至少选择一个物体";
}
EditorPrefs.SetInt("EditSpeed", changeSpeed);
}
private void OnSelectionChange()
{
OnWizardUpdate();
}
}
16.显示进度条( EditorUtility.DisplayProgressBar())
using UnityEngine;
using UnityEditor;
public class EnemyChange : ScriptableWizard {
[MenuItem("myTools/CreateWizard")]
static void CreateWizard()
{
DisplayWizard<EnemyChange>("统一修改敌人","修改并关闭","修改");
}
public int changeSpeed = 10;
private void OnEnable()
{
changeSpeed = EditorPrefs.GetInt("EditSpeed", changeSpeed);
}
private void OnWizardCreate()//检测“修改并关闭”按钮的触发
{
GameObject[] gos = Selection.gameObjects;
int count = 0;
EditorUtility.DisplayProgressBar("进度", "0/" + gos.Length + "完成修改值", 0);
foreach (GameObject go in gos)
{
gameobject_hp hp = go.GetComponent<gameobject_hp>();
Undo.RecordObject(hp, "撤销更改");
hp.Hp += 10;
count++;
EditorUtility.DisplayProgressBar("进度", count +"/" + gos.Length + "完成修改值", (float)count / gos.Length);
}
EditorUtility.ClearProgressBar();
ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体的值被修改了"));
}
private void OnWizardOtherButton()//检测“修改”按钮的触发
{
OnWizardCreate();
}
private void OnWizardUpdate()//弹出对话框和修改对话框中的属性字段时会被调用
{
errorString = null;
helpString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "您当前选择了" + Selection.gameObjects.Length + "物体";
}
else
{
errorString = "请至少选择一个物体";
}
EditorPrefs.SetInt("EditSpeed", changeSpeed);
}
private void OnSelectionChange()
{
OnWizardUpdate();
}
}
17.创建自定义窗口
using UnityEngine;
using UnityEditor;
public class MyWindow :EditorWindow {
[MenuItem ("Window/myWindow")]
static void ShowMyWindow()
{
MyWindow window = EditorWindow.GetWindow<MyWindow>();
window.Show();
}
private string name;
private void OnGUI()
{
GUILayout.Label("这是我的窗口");
name = GUILayout.TextField(name);
if(GUILayout .Button("创建"))
{
GameObject go = new GameObject(name);
Undo.RegisterCreatedObjectUndo(go, "create gameobject");
}
}
}