unity编辑器扩展

01:添加自己的工具

以Editor命名的文件夹允许其中的脚本访问Unity Editor的API。如果脚本中使用了在UnityEditor命名空间中的类或方法,它必须被放在名为Editor的文件夹中。Editor文件夹中的脚本不会在build时被包含。
在项目中可以有多个Editor文件夹。
注意:如果在普通的文件夹下,Editor文件夹可以处于目录的任何层级。如果在特殊文件夹下,那Editor文件夹必须是特殊文件夹的直接子目录。
1.必须是放在 Assets / Editor 文件夹下的类,且使用了 using UnityEditor 
2.调用的函数必须是静态函数(static)

MenuItem菜单项
MenuItem属性允许你添加菜单项到主菜单和检视面板上下文菜单。
(该属性把任意静态函数变为一个菜单命令。仅静态函数能使用这个MenuItem属性。)
MenuItem是编辑器类,所以技能导入 using UnityEditor; 命名空间
且一般我们的类也不是集成自MonoBehaviour的,而是集成ScriptableObject

using UnityEngine;
using UnityEditor; //

public class Tools  {

    [MenuItem("Tools/Test")]
    public  static void Test()
    {
       Debug.Log("233");
    }

}

在这里插入图片描述
02:MenuItem菜单的先后排序

MenuItem(string itemName, bool isValidateFunction, int priority) 
itemName:菜单名称路径 
isValidateFunction:不写为false,true则点击菜单前就会调用 
priority:菜单项显示排序
第一个参数为菜单路径名称,可添加菜单快捷键:(空格后加如下符号设置) 
第三个参数为优先级,表示上下排列的顺序,小的在上,不写则默认为1000。
  [MenuItem("Tools/Test1", false,1)]
    public static void Test1()
    {
        Debug.Log("Test1");
    }

    [MenuItem("Tools/Test2", false, 2)]
    public  static void Test2()
    {
        Debug.Log("Test2");
    }

    [MenuItem("Tools/Test3", false, 15)]
    public  static void Test3()
    {
        Debug.Log("Test3");
    }

03:给组件的右键菜单栏添加按钮

    //CONTEXT  加组件名  按钮名
    [MenuItem("CONTEXT/PlayerHealth/ChangePlayeVelue")] 
    public static void ChangePlayeVelue(MenuCommand cmd)
    {
        //上下文是一个菜单命令的目标对象。
       CompleteProject.PlayerHealth playerHealth =cmd.context as CompleteProject.PlayerHealth;
       
       playerHealth.currentHealth = 100;
       playerHealth.startingHealth = 1000;

    }

在这里插入图片描述
04:学习使用Selection获取选择的游戏物体

    [MenuItem("GameObject/Delete",false,10)]
    public  static  void Delete()
    {
        Object[] objects=Selection.gameObjects;
        foreach (var item in objects)
        {
          GameObject.DestroyImmediate(item);
        }
    }

05:编写可以撤销的删除操作

  [MenuItem("GameObject/Delete",false,10)]
    public  static  void Delete()
    {
        Object[] objects=Selection.gameObjects;
        foreach (var item in objects)
        {
            //利用undo可以撤销
         Undo.DestroyObjectImmediate(item); 
        }
    }

06:给菜单项添加快捷键

  //% =ctrl #=shif &= alt
 [MenuItem("GameObject/Delete _s",false,10)]
    public  static  void Delete()
    {
        Object[] objects=Selection.gameObjects;
        foreach (var item in objects)
        {
            //利用undo可以撤销
         Undo.DestroyObjectImmediate(item); 
        }
    }

07:给组件添加右键菜单的方法ContextMenu和ContextMenuItem

    //给字段设置右键添加功能
    [ContextMenuItem("SetBool","ChangeValue")]
    public bool isNeedPlay;

    public void ChangeValue()
    {
        isNeedPlay = !isNeedPlay;
    }
  public int hp = 100;
    //给方法设置
    [ContextMenu("SetHpBtn")]
    public void SetHp()
    {
        hp += 100;
    }

在这里插入图片描述
08:创建对话框

//继承ScriptableWizard 
public class ChangeValue : ScriptableWizard
{
    [MenuItem("Tools/ChangeValue")]
    public static void ChangeValues()
    {
        ScriptableWizard.DisplayWizard<ChangeValue>("改变字段的值");
    }


    public string name=null;
    public int hp;
    public float speed;
}

在这里插入图片描述
09:兼容按钮点击统一修改字段


public class ValueChange : ScriptableWizard
{

    public int addHp = 10;
    public float addSpeed=20;

    [MenuItem("Tools/Change")]
    public static void ChangeValue(MenuCommand cmd)
    {
        ScriptableWizard.DisplayWizard<ValueChange>("改变hp 和speed的值");
    }


    //按钮点击
    public void OnWizardCreate()
    {
        GameObject[] items = Selection.gameObjects;
        foreach (var item in items)
        {
            Value value = item.GetComponent<Value>();
            Undo.RecordObject(value,"2"); //撤销操作
            value.hp += this.addHp;
            value.speed += this.addSpeed;

        }
    }
}

10:显示提示框的帮助信息和错误信息

  //更新
    public void OnWizardUpdate()
    {
        helpString = null;
        errorString = null;
        if (Selection.gameObjects.Length > 0)
        {
            helpString = "当前选择了:"+ Selection.gameObjects.Length+"个物体";
        }
        else
        {
            errorString = "没有选择物体";
        }
        
    }
    public void OnSelectionChange()
    {
        Debug.Log("选择的物体改变了");
    }

在这里插入图片描述
11:使用ShowNotification显示提示信息 继承: EditorWindow

ShowNotification(new GUIContent("值被改变了"));

在这里插入图片描述
12:使用EditorPrefs保存数据

        EditorPrefs.SetInt("addHp",addHp);
        EditorPrefs.SetFloat("addSpeed",addSpeed);
        void OnEnable()
    {
        addHp=EditorPrefs.GetInt("addHp");
        addSpeed = EditorPrefs.GetFloat("addSpeed");
    }

13:显示进度条

  public void OnWizardCreate()
    {
        GameObject[] items = Selection.gameObjects;
        EditorUtility.DisplayCancelableProgressBar("进度", "Shows a progress bar"+items.Length,0);
        int count = 0;
        foreach (var item in items)
        {
            Value value = item.GetComponent<Value>();
            Undo.RecordObject(value, "2"); //撤销操作
            value.hp += this.addHp;
            value.speed += this.addSpeed;
            count++;
            EditorUtility.DisplayCancelableProgressBar("进度", "Shows a progress bar" + items.Length, (float)count/items.Length);

        }
        EditorUtility.ClearProgressBar();
    }

14:创建自定义窗口


/// <summary>
/// 创建自己的窗口
/// </summary>
public class MyWindow : EditorWindow {

    [MenuItem("Window/ShowWindow")]
    public static void ShowWindow()
    {
        MyWindow myWindow=EditorWindow.GetWindow<MyWindow>(); //获得窗口
        myWindow.Show(); //显示窗口

    }

    private string name=null;
    void OnGUI()
    {
        GUILayout.Label("我的窗口");
       name = GUILayout.TextField(name);
        if (GUILayout.Button("创建物体"))
        {
            GameObject go=new GameObject(name);
            Undo.RegisterCreatedObjectUndo(go,"go"); //注册
        }
    }
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值