Unity编辑器扩展

(我们自己写的脚本放在 Editor文件里(Editor 自己创建 跟创建Scenes文件一样))

1 增加简单菜单栏(第一排菜单栏)


(我们使用静态方法便于调用     不用静态方法   我们Unity不能显示出来)

public Class  Tools  {

   [MenuItem("Tools/Test1",false,1)] 

  (MenuItem)这个上面添加菜单


(Test1 是名称)

 static  void Test1()   //调试信息  点击Test1  控制台输出“ 加油”
    {
        Debug.Log("加油");

    }

    [MenuItem("Tools/Test2",false,12)]//在菜单栏上添加自己的方法   菜单栏中横线 分类   相邻的两个菜单要想用横线划分 priority必须相差11


    static void Test2()
    {
        Debug.Log("加油");
    }
    [MenuItem("Tools/Test3",false,0)]//在菜单栏上添加自己的方法


    static void Test3()
    {
        Debug.Log("加油");
    }

[MenuItem("Tools/Test3",false,0)]  参数  第一个是名称 和路径  第二个默认为false  第三个(priority 优先级)作用有两个 a:排序 数字越小越排在前面 列如 Test3 第三个参数为0 所以排在前  b:分界线  相邻的两个菜单如果第三个参数相差11就会有分界线  列如Test1 和Test2


    [MenuItem("GameObject/myTool", false, 10)]//在已有的菜单栏上添加自己的方法
10表示 放在很前面 第一级 

Hierarchy面板中也可以使用了


    static void myTool()
    {
        Debug.Log("加油德玛西亚");
    }

}

2  给我们自己写的菜单栏添加快捷键

  • %-CTRL 在Windows / CMD在OSX
  • # -Shift
  • & -Alt
  • LEFT/RIGHT/UP/DOWN-光标键
  • F1…F12
  • HOME,END,PGUP,PDDN

字母键不是key-sequence的一部分,要让字母键被添加到key-sequence中必须在前面加上下划线(例如:_g对应于快捷键”G”)

快捷键的组合被添加在菜单项的路径后面,并以一个空格分隔

例子 上面的Test3

    [MenuItem("Tools/Test3 %a",false,0)]//在菜单栏上添加自己的方法
    static void Test3()
    {
        Debug.Log("加油");
    }

%a 代表快捷键 ctrl+A


    [MenuItem("Tools/Test3 _g",false,0)]//在菜单栏上添加自己的方法
    static void Test3()
    {
        Debug.Log("加油");

    }

_g  代表快捷键 G


3.给组件的右键菜单栏添加按钮

举例  Camera 的Camera组件 

public Class CameraEditor{

//CONTEXT  组件   Camera 组件名 (脚本名)  InitHealthAndSpeed  按钮名

    [MenuItem("CONTEXT/Camera/changeView")]

// MenuCommand  表示该组件(Camera)  cmd.context  表示该Camera 组件的内容

    static void ChangeViem(MenuCommand cmd)   

    {

      //强制转换为Camera

       Camera ca=cmd.context as Camera;  

        Debug.Log("加油");
    }

}


如上图 我们右击Camera  时  显示出我们写的按钮 changeView 点击 输出 “加油”

4.使用Selection获取选择的游戏物体

   [MenuItem("Tools/showInfo", false, 1)]
    static void Test1()
    {

        Debug.Log(Selection.activeGameObject.name);// 显示我们第一个选择的游戏物体

     Debug.Log(Selection.objects.Length);// 获取我们选择游戏物体的个数(Preject 和Hierarchy都可以)

      Debug.Log(Selection.transforms.Length);// 只能获取在Hierarchy面板上选择物体的个数

    }


选择游戏物体  点击我们写的按钮  输出的是 我们选择游戏物体的名字

   /// <summary>
   /// 删除选择的物体
   /// </summary>
    [MenuItem("GameObject/my delete", false, 11)]
    static void mydelete()
    {
       foreach (var o in Selection.objects)
       {

           GameObject.DestroyImmediate(o);//使用这个方法写的 删除掉的物体我们不能进行撤销

 Undo.DestroyObjectImmediate(o); //使用这个方法写的 删除掉的物体我们可以进行撤销

       }
       //需要把删除操作注册到操作记录里面

    }


选择游戏物体 点击 我们写的按钮 可以删除

(我自己试过 选择两个删除没问题  选择三个以上删除Unity会关闭)

   [MenuItem("GameObject/myTool", false, 10)]//在菜单栏上添加自己的方法


    static void myTool()
    {
        Debug.Log("加油德玛西亚");
    }


    [MenuItem("GameObject/my delete", true, 11)]//在菜单栏上添加自己的方法
    static bool MyDeleteValidate()
    {
        if (Selection.objects.Length>0)
        {
            return true;
        }
        return false;
    }

5.控制菜单项是否启用的功能



    [MenuItem("GameObject/my delete", true, 11)]//在菜单栏上添加自己的方法  

                             (在执行下面那个方法前 先进行这个方法的验证)

                             (第二个参数为true 表示验证该方法是否可行)

    static bool MyDeleteValidate()
    {
        if (Selection.objects.Length>0)
        {
            return true;
        }
        return false;
    }


    [MenuItem("GameObject/my delete", false, 11)]//在菜单栏上添加自己的方法
    static void mydelete()
    {
       foreach (var o in Selection.objects)
       {
           //GameObject.DestroyImmediate(o);
           Undo.DestroyObjectImmediate(o); //使用这个方法写的 删除掉的物体我们可以进行撤销
       }
       //需要把删除操作注册到操作记录里面
    }


没有选择物体的时候   我们写的按钮 为灰色 表示不可用 


选择游戏物体的时候  我们写的按钮  表示可用


6. 给自己写的脚本里添加按钮(系统自带的组件不能使用该方法)

例子 : 我们写了一个Cube脚本 挂载到我们创建的Cube物体上  

我们在Cube脚本中 写下如下 语句(给Cube添加了SetScale脚本)

  [ContextMenu("SetScale")]
    void SetScale()
    {
        pox = 100;
    }


 给我们脚本的属性添加按钮

例子: 

  [ContextMenuItem("Test","Test1")]   

   第一个参数表示我们按钮的名称    第二个参数 是我们点击按钮执行 的方法

    public float pox=10;

  void Test1()
    {
        Debug.Log("加油");

    }


当我们右击Pox属性的时候  显示出我们的按钮Test 点击它执行方法 输出“加油”

7 如何创建对话框 (用于统一修改数据)

public class EnemyChange :ScriptableWizard //(ScriptableWizard   继承这个对话框的类)
{
    [MenuItem("Tools/CreateWizard")]  //创建按钮
    static void CreateWizard()

    {

//  下面这个方法是用来显示对话框的   EnemyChange 是我们 需要指定的类型   (这里是我们的类)

// "统一修改敌人"是我们给对话框取的名字

//"ChangeValue"  我们对话框上的按钮名字

//"Other Button" 我们自己额外创建的按钮

        ScriptableWizard.DisplayWizard<EnemyChange>("统一修改敌人","ChangeValue","Other Button");   
    }
    public int changeSpeed = 10;  // 我们要展现出来修改的属性




  //给我们添加的按钮 添加一个方法
    void OnWizardOtherButton()
    {
        Debug.Log("加油");       //点击OtherButton  会执行该方法  (按下之后不会关闭这个对话框,按下另外一                                                                                                               个按钮 会关闭该对话框)

    }


 void OnWizardCreate()    //检测 对话框的按钮  的点击

    { 

(修改我们选择物体上的脚本里面的属性)

          GameObject[] enemyPrefabs = Selection.gameObjects;  //保存我们选择的物体
        foreach (var go in enemyPrefabs)   //遍历我们选择的物体
        {
         Cube cb   =   go.GetComponent<Cube>();   //得到我们选择的物体上的脚本
            Undo.RecordObject(cb,"change"); // 记录我们 的操作 便于撤销 “change”是随便起的名字
            cb.speed += changeSpeed;   //修改脚本属性
        }

    }

    // 当前对话框弹出来和字段值修改的时候会被调用
    void OnWizardUpdate()
    {
        helpString = null;
        errorString = null;
        if (Selection.gameObjects.Length>0)
        {
            helpString = "您当前选择了:" + Selection.gameObjects.Length + "个敌人";  // 帮助信息提示
           // helpString = "加油";
        }
        else
        {
            errorString="请选择至少一个敌人";     //  错误信息提示(红色提示字)
        }
    }
    // 当我们选择改变的时候 会被调用
    void OnSelectionChange()
    {
        OnWizardUpdate();
    }

}

8.如何显示提示信息

使用ShowNotification这个方法显示提示信息

ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体的值被修改了")); 


9 使用EditorPrefabs 保存数据

private int changeSpeed=10;

   // 当窗口被创建出来 的时候调用的

    void OnEnable()
    {
     changeSpeed =  EditorPrefs.GetInt("changeSpeed", changeSpeed);

    }

 // 当前对话框弹出来和字段值修改的时候会被调用
    void OnWizardUpdate()

    {

    EditorPrefs.SetInt("changeSpeed",changeSpeed); //存储我们的修改的值

    }

作用 当我们修改值的时候  会被对话框 保存下来  

例子 :

      把15修改为20   点击AddSpeed   


再重新打开   我们的值是不是修改并保存下来了呢


10.显示进度条

编辑进度条

 EditorUtility.DisplayProgressBar("进度","0/"+enemyPrefabs.Length+"完成修改值",0);

int  count=0;

count++;

 EditorUtility.DisplayProgressBar("进度", count+"/" + enemyPrefabs.Length + "完成修改值", count/enemyPrefabs.Length);


 EditorUtility.ClearProgressBar();    进度条完成后 关闭进度条

11.创建自定义窗口

using UnityEditor;

public class MyWindow : EditorWindow {  // 继承自这个类EditorWindow

    [MenuItem("Window/Show myWindow")]
    static void ShowMyWindow()
    {
     MyWindow  window   =   EditorWindow.GetWindow<MyWindow>();
        window.Show();   // 显示出来这个窗口
    } 
}

  private string name=null;
    //绘制窗口
    void OnGUI()
    {
        GUILayout.Label("这是我的窗口");
      name=  GUILayout.TextField(name);
        if (GUILayout.Button("创建"))
        {

            GameObject go=new GameObject(name);

Undo.RegisterCreatedObjectUndo(go,"create gameObjet");  //注册到操作记录里   可以撤销操作

        }
    }





  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值