关于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 }
但行好事,莫问前程!