关于Unity编辑器拓展的一些小技巧

首先:对于编辑器拓展的脚本都应该放在Assets/Editor文件夹下

然后根据需要实现相对应的方法:

1.实现简单菜单栏按钮触发

1   //Unity上方菜单栏添加自定义按钮触发方法
2     [MenuItem("MochaTools/DoMenuEvent")]
3     static void DoMenuEvent()
4     {
5         Debug.Log("DoMenuEvent");
6     }

2.菜单栏按钮触发的方法拓展(此处举例:当选中游戏物体时按钮启用,未选中任何游戏物体时按钮至灰色弃用)

 1  //Unity上方已经存在的菜单栏添加自定义按钮触发方法
 2     //其中参数为(1.菜单按钮名 2.判断当前按钮功能是否启用3.所处的层级,越低显示越靠前,默认为1000)
 3     //所以想要在Hierarchy面板上右键添加功能,在GameObject目录下将层级添加靠前即可
 4     //所以想要在Project面板上右键添加功能,在Assets目录下将层级添加即可
 5     [MenuItem("GameObject/DoHaveMenuEvent",true,1)]
 6     static bool DoHaveMenuEventJudge() //同目录不同方法名
 7     {
 8         //这里设置条件返回true则同目录下的按钮才执行,返回false则同目录下的按钮至灰
 9         if (Selection.objects.Length > 0) return true;
10         else return false;
11     }
12     [MenuItem("GameObject/DoHaveMenuEvent", false, 1)]
13     static void DoHaveMenuEvent()
14     {
15         Debug.Log("DoHaveMenuEvent");
16     }

3.当同一层级下的按钮层次相差10以上时,菜单栏按钮间形成直线分割样式

 1  //当相邻两个菜单栏按钮之间的层级相差10以上时,会出现一条分割线
 2     [MenuItem("MochaTools/DoMenuEvent1",false ,0)]
 3     static void DoMenuEvent1()
 4     {
 5         Debug.Log("DoMenuEvent1");
 6     }
 7     [MenuItem("MochaTools/DoMenuEvent2", false, 11)]
 8     static void DoMenuEvent2()
 9     {
10         Debug.Log("DoMenuEvent2");
11     }

4.对挂载在游戏物体身上的组件添加右键按钮

 1 //对挂载在游戏物体身上的组件(系统组件或挂载的脚本)进行右键菜单添加操作功能按钮
 2     //CONTEXT(CONTEXT必须全大写)/组件名/右键出来的方法名
 3     [MenuItem("CONTEXT/Transform/DoComponentEvent")]
 4     static void DoComponentEvent(MenuCommand cmd)   //参数cmd:包含该组件的数据信息用cmd.context表示
 5     {
 6         //测试使用方法
 7         //获取该组件
 8         Transform tTransform = cmd.context as Transform;
 9         //设置该组件位置
10         tTransform.position = Vector3.one;
11     }

5.对物体的选中(单个或多个)操作

 1 //选中单个游戏物体并进行操作
 2     [MenuItem("MochaTools/DoMenuEvent3")]
 3     static void DoMenuEvent3()
 4     {
 5         //Selection.activeGameObject只对Hierarchy面板中选中的物体有效
 6         //如果选中多个,则以第一个选中的游戏物体为准
 7         Transform tTransform = Selection.activeGameObject.transform;
 8 
 9         Debug.Log(tTransform.name);
10     }
11 
12     //选中多个游戏物体并进行操作
13     [MenuItem("MochaTools/DoMenuEvent4")]
14     static void DoMenuEvent4()
15     {
16         //Selection.objects对Hierarchy面板中选中的物体以及Project面板下的预制体有效
17         //如果选中多个,则以第一个选中的游戏物体为准
18         Object[] tObjs= Selection.objects;
19         for (int i = 0; i < tObjs.Length; i++)
20         {
21             Debug.Log(tObjs[i].name );
22         }
23     }

6.对选中的游戏物体进行删除操作

 1  //删除选中的多个游戏物体(必须用DestroyImmediate,而不能用Destory)
 2     //只能在Hierarchy面板上进行删除撤销,对预制体进行操作会报错崩溃
 3     //选中多个游戏物体并进行操作
 4     [MenuItem("MochaTools/DoMenuEvent5")]
 5     static void DoMenuEvent5()
 6     {
 7         //Selection.objects对Hierarchy面板中选中的物体以及Project面板下的预制体有效
 8         //如果选中多个,则以第一个选中的游戏物体为准
 9         Object[] tObjs = Selection.objects;
10         for (int i = 0; i < tObjs.Length; i++)
11         {
12             //删除不可撤销
13             //GameObject.DestroyImmediate(tObjs[i]);
14             //利用Undo进行的删除可以Ctrl+Z撤销回来
15             Undo.DestroyObjectImmediate(tObjs[i]);
16         }
17     }

7.对菜单栏按钮添加快捷键

 1   //为菜单栏按钮添加快捷键
 2     //在名字后面添加(大小写无关)
 3     //1.如果为单键位则添加  空格_键位   eg: _t 
 4     //2.如果为组合件则添加  空格组合件转码键位    eg:Ctrl+Q  即%q
 5     //组合件转码 %=Ctrl  #=Shift &=Alt
 6     [MenuItem("MochaTools/DoMenuEvent6 %Q")]
 7     static void DoMenuEvent6()
 8     {
 9         Debug.Log("DoMenuEvent6");
10     }

8.对自定义脚本的右键添加方法,以及脚本中属性的右键添加方法

 1 /*************************************************
 2  * 项目名称:Unity编辑器拓展
 3  * 脚本创建人:魔卡
 4  * 脚本创建时间:2017.12.18
 5  * 脚本功能:测试脚本
 6  * ***********************************************/
 7 using System.Collections;
 8 using System.Collections.Generic;
 9 using UnityEngine;
10 
11 //测试脚本类
12 public class TempScriptsByMocha : MonoBehaviour
13 {
14     [ContextMenuItem( "加血","AddHp")]    //属性右键按钮方法  参数:1.右键按钮名字 2.触发的方法
15     public int m_hp = 10;
16 
17     [ContextMenu( "AddHp")]     //脚本右键方法  参数:右键按钮名字
18     void AddHp()
19     {
20         m_hp += 20;
21     }
22 
23 
24 }
原文地址:https://www.cnblogs.com/mrmocha/p/8058372.html