Unity编辑器扩展知识点

1、在菜单栏上增加MenuItem

using UnityEditor;
using UnityEngine;
public class Tools{
    [MenuItem("Tools/test",false,10)]//参数1是在菜单栏上的显示路径,参数3是该按钮的显示层级,每个分类的参数相差十倍左右
    static void Test(){
        Debug.Log("Test");
    }
}

2、在组件右键上添加MenuItem

using UnityEditor;
using UnityEngine;

public class Tools{
    [MenuItem("CONTEXT/Rigidbody/Clear")] //CONTEXT/组件名/按钮名
    static void ClearMassAndGravity(){
        Rigidbody rb = cmd.context as Rigidbody;
        rb.mass = 0;
        rb.useGravity = false;
    }
}

3、选中游戏物体,点击自定义的delete按钮删除选中的物体

using UnityEngine;
using UnityEditor;

public class Tools{
    [MenuItem("GameObject/MyDelete",false,11)] 
    static void MyDelete(){
        foreach(Object o in Selection.objects){
        //GameObject.DestroyImmediate(o);        //不可撤销的删除
        Undo.DestroyObjectImmediate(0);    //可以撤销的删除
    }
}

4、给菜单项添加快捷键

using UnityEngine;
using UnityEditor;
public class Tools{
   //%=Ctrl #=Shift &=Alt
 [MenuItem("MyTools/Test1 _t")]  //快捷键为T
    static void Test1(){
      Debug.Log("Test1");
    }
[MenuItem("MyTools/Test1 %t")]  //快捷键为Ctrl + t
    static void Test1(){
      Debug.Log("Test1");
    }
[MenuItem("MyTools/Test1 #t")]  //快捷键为Shift + t
    static void Test1(){
      Debug.Log("Test1");
    }
}

5、控制菜单项是否可用(是否置灰)

[MenuItem("Copy/CopyImage #e",false,1)]  //
static void CopyImage(){  
    Debug.Log("Image复制");  
    compoent = Selection.activeGameObject.GetComponent<Image>();
}  

[MenuItem("Copy/CopyImage #e",true,1)] //参数2为true
   static bool CopyValidate(){
    if (Selection.activeGameObject == null) {
        return false;
    } else {
	return true;
    }
} 

6、直接在组件脚本下给组件添加右键菜单项按钮

[ContextMenu("setColor")] //参数1是方法名,不需要引入UnityEditor

7、直接在组件脚本下给某个变量(属性)添加右键菜单项按钮

[ContextMenuItem("add hp","AddHP")] //参数1按钮名字、参数2方法名  不需要引入UnityEditor,不需要写在方法前面

8、对话框

using UnityEngine;
using UnityEditor;
//对话框类
public class Panel1:ScriptableWizard{
    [MenuItem("Tools/CreateWizard")] //菜单按钮
    static void CreateWizard(){  //创建对话框对象的方法,可以写在其他地方
        ScriptableWizard:DisplayWizard<Panel1>("面板","按钮名字","OtherButton");//按钮名字默认叫create
    }
    public int Value1 = 10;


    //create按钮click事件    会关闭对话框
    void OnWizardCreate(){         
      Debug.Log("Create Click");         
      GameObject[] enemyPrefabs = Selection.gameObjects;//获得选中的所有游戏对象或者Prefab
      EditorUtility.DisplayProgressBar("进度","0/" + ememyPrefabs.Length + "完成修改" , 0);//初始化进度条
      int count = 0;
      foreach (GameObject go in ememyPrefabs){
        Undo.RecordObject(hp,"HP change");            //可以让下面的更改变得可以撤销(Ctrl+Z)
        EnemyHeath hp = go.GetComponet<EnemyHeath>(); //获得敌人组件
        hp.startingHeath += Value1;                   //更改组件数值
        count++;
        //更新进度条信息
        EditorUtility.DisplayProgressBar("进度",count + "/" + ememyPrefabs.Length + "完成修改" , count / (float)ememyPrefabs.Length);
      }
      EditorUtility.ClearProgressBar();
    }


    //当窗口被创建的时候调用
    void OnEnable(){
      Value1 = EditorPrefs.GetInt("Panel1.Value1",Value1);//使用上次窗口的值,获取键值为Panel1.Value1的变量,如果没有则返回Value1的值
    }


    //OtherButton按钮的click事件 不会关闭对话框
    void OnWizardOtherButton(){
      Debug.Log("Other button click");    
      GameObject[] enemyPrefabs = Selection.gameObjects;//获得选中的所有游戏对象或者Prefab
      foreach (GameObject go in ememyPrefabs){
        Undo.RecordObject(hp,"HP change");            //可以让下面的更改变得可以撤销(Ctrl+Z)
        EnemyHeath hp = go.GetComponet<EnemyHeath>(); //获得敌人组件
        hp.startingHeath += Value1;                   //更改组件数值
      }
      ShowNotification(new GUIContent("有"+Selection.gameObjects.Length+"个物体被改变了"));  //在对话框内提示一个信息,几秒后消失
    }


    //当对话框弹出或者里面内容有改变的时候会调用
    void OnWizardUpdate(){
      Debug.Log("Update");
      helpString = "";
      errorString = "";
      if(Selection.gameObjects.Length>0){
        helpString = "你当前选中了"+Selection.gameObjects.Length+"个gameObject";   //helpString为基类变量,用于显示在窗口上
      }
      else
      {
        errorString = "请选中一个gameObject";                                      //errorString为基类变量,用于显示在窗口上
      }
      EditorPrefs.SetInt("Panel1.Value1",Value1);                                  //记录当前的值,以便于下次打开窗口使用
    }
    
    //当选择的gameObject发生改变的时候会调用
    void OnSelectionChange(){
      OnWizardUpdate();
    }
}

9、创建长久存在的对话框

using System.Collentions;
using System.Collentions.Generic;
using UnityEngine;
using UnityEditor;

//长久存在的对话框类
public class MyWindow : EditorWindow{
    [MenuItem("Windows/Display MyWindow")]
    static void DisplayerMyWindow(){
      MyWindow myWindow = EditorWindow.GetWindow<MyWindow>();//获取窗口对象
      myWindow.Show();
    }

    private string name = "";
    void OnGUI(){
      GUILayout.Label("这是我的窗口");
      name = GUILayout.TextField(name);
      if(GUILayout.Button("创建")){
        GameObject go = new GameObject(name); // 创建游戏物体
        Undo.RegisterCreateObjectUndo(go , "create gameObject"); //注册到操作记录,就可以进行撤销
      }
    }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值