读一读

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会加横线