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