using UnityEngine; using UnityEditor; public class Migrazar : ScriptableWizard { void OnWizardCreate(){ GameObject[] objects = Selection.gameObjects; foreach (GameObject go in objects) { Undo.RecordObject (go, "change name");//在更改前声明要记录的对象 go.name = changeName; } } }
这样就可以使用Ctrl+z撤销操作了
public class Migrazar : ScriptableWizard { [MenuItem("Item/CreateWizard")] public static void CreateWizard(){ ScriptableWizard.DisplayWizard<Migrazar> ("I am a boy","Change"); } public string changeName = "你的名字"; void OnWizardCreate(){ GameObject[] objects = Selection.gameObjects; foreach (GameObject go in objects) { go.name = changeName; } } }
ScriptableWizard.DisplayWizard的第一个参数为导向框的标题。第二个为按钮的名称
OnWizardCreate方法是按钮被点击后触发的方法,父类方法已经做好监听了
using UnityEngine; using UnityEditor; public class Migrazar : ScriptableWizard { [MenuItem("Item/CreateWizard")] public static void CreateWizard(){ //显示向导框 ScriptableWizard.DisplayWizard<Migrazar> ("I am a boy"); } //向导框显示的类容 public int changeHp = 100; public string changeName = "你的名字"; }
脚本放在Editor下,继承自ScriptableWizard,表示是一个向导框类
通过某种条件触发显示向导框,这里的菜单触发
这两个特性不是在命名空间UnityEditor下的,而是在UnityEngine下的
public class Player2 : MonoBehaviour { [ContextMenuItem("Add Hp","AddHp")] public int hp = 1000;//对属性右键弹出 void AddHp(){ this.hp += 100; } [ContextMenu("ResetHp")] void ResetHp(){//扩展组件右键菜单 this.hp = 100; } }
ContextMenuItem的第一个参数为菜单名称,第二个为要调用的方法
[MenuItem("GameObject/MyDelete",false,11)] public static void MyDelete(){ foreach (Object o in Selection.objects) { //GameObject.DestroyImmediate (o);//编辑器下不能用Destroy Undo.DestroyObjectImmediate(o); } } [MenuItem("GameObject/MyDelete",true,11)] public static bool MyDeleteValidate(){ if (Selection.objects.Length > 0) { return true; } else { return false; } }//GameObject的,在Inspector面板中不管用
上面第一个是功能方法,第二个是验证方法,不同的是验证方法的MenuItem第二个参数设置为true,其他一样
方法的返回参数为bool,返回true表示菜单可用,false表示不可用
[MenuItem("Item/1 _1")] public static void Item(){ Debug.Log ("1"); } [MenuItem("Item/2 %2",false,999)] public static void Item2(){ Debug.Log ("2"); } [MenuItem("Item/3 &3",false,1011)] public static void Item3(){ Debug.Log ("3"); }
格式:在菜单路径后面加空格,输入快捷键
快捷键规定:1.单个键的 _+键名 ; 2.组合键 组合符+键名
组合符:%=ctrl,#=shift,&=alt
[MenuItem("GameObject/MyDelete",false,11)] public static void MyDelete(){ foreach (Object o in Selection.objects) { GameObject.DestroyImmediate (o);//编辑器下不能用Destroy } }
通过Selection的静态属性获取到相关的选择信息,例如activeGameObject,transforms等(具体用到具体查)
在编辑器下,是没有给Destroy方法存放垃圾的空间的,所以直接用DestroyImmediate立刻删掉(不能撤回)
要想有撤回的操作,需要用Undo类进行操作,Undo.DestroyObjectImmediate(o);
[MenuItem("CONTEXT/Transform/hello")] public static void Hello(MenuCommand cmd){ Transform tran = cmd.context as Transform; tran.position = tran.position * 2; }
组件菜单扩展指定是在Inspector页面右键组件后显示的菜单
命名模式:CONTEXT/组件类名/菜单名
通过MenuCommand的context变量获取到要操作的组件
[MenuItem("GameObject/Haha",false,10)] public static void Haha(){ Debug.Log ("haha"); } [MenuItem("Assets/Hehe")] public static void Hehe(){ Debug.Log ("hehe"); }
GameObject下的优先级在10左右的菜单,在Hierarchy里面右键时会显示这些菜单
Assets下的菜单,在Project里面右键时或显示这些菜单
[MenuItem("Item/1")] //默认是1000 public static void Item(){ Debug.Log ("1"); } [MenuItem("Item/2",false,999)] public static void Item2(){ Debug.Log ("2"); } [MenuItem("Item/3",false,1011)]//和上面的1000分组了,加了条横线 public static void Item3(){ Debug.Log ("3"); }
MenuItem的第三个参数就是优先权,数值越小排列越前,两个相近的菜单优先级相差11及以上,就叫做分组了,Unity会加横线