unity编辑器拓展整理(主要是siki的视频教程)

编辑器拓展

https://blog.csdn.net/zxl321365712/article/details/80080586

蛮牛上一个详细的博客

http://www.manew.com/thread-90330-1-1.html

siki关于编辑器拓展的视频教程(免费)

http://www.sikiedu.com/my/course/47

官方教程

https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu-items

API界面

https://docs.unity3d.com/ScriptReference/MenuItem.html

编辑器脚本都在Editor下,在打包时不会包含

编辑器特性位于unityEditor命名空间下

 

添加菜单按钮

[MenuItem("Tools/test")]//在菜单上显示命令

   public static void Test()//点击该命令后可以执行这个方法,私有也可访问

   {

       Debug.Log("Test Function is work");

   }

public MenuItem(string itemName, bool isValidateFunction, int priority);

  1. itemName路径:每个/代表一级菜单

  2. isValidateFunction是否为可用性检查,在后面介绍。

  3. priority优先级,越小越靠上,当优先级相差大于10以上时会分组

  • 路径重复时,后添加的菜单会覆盖先添加的。

  • 系统内置的功能也会被覆盖。

  • Game Object中,优先级小于50(不包括)的会显示在hierarchy中。

  • component菜单下的内容必须继承monobehaviour,因此需要使用AddComponentMenu添加,其他使用方法相似

允许加空格,空格后可设置快捷键,不可重复,如"Tools/test4 _q"

特殊快捷键如下:

* _ – 无

* % – CTRL on Windows / CMD on OSX

* # – Shift

* & – Alt

* LEFT/RIGHT/UP/DOWN – Arrow keys

* F1…F12 – F keys

* HOME, END, PGUP, PGDN

给脚本,组件添加右键菜单:

路径用CONTEXT/[组件名]/[其他]

 

获取点击的组件:方法添加MenuCommand类参数,其中context字段即为我们右键打开菜单的那个物体(或者组件)。建议存成对应类型再使用,可以用强制转换,或者as。用as转换,失败时会返回空,而强制会报错。

static public void RigidbodyTools(MenuCommand cmd)

        {

            Rigidbody rigidbody = cmd.context as Rigidbody;

        }

selection类

这个是unity用来获取当前选中的物体的。可以得到用户当前选中的物体。常用内容:

  • activeObject//当前选中的那个物体

  • Objects//所有选中的物体,返回一个数组

  • activeGameObject//当前选中的物体(一个,多个时为第一个)(包括预制体,不可改变物体)

  • gameObjects//所有选中的物体,返回一个数组,(包括预制体,不可改变物体)

  • activeTransform//当前选中的物体的transform

  • transforms//选中的物体中最高层级

 

添加可撤销操作:

编辑器脚本中大多数操作不会注册到栈中,不能使用

使用Undo,操作的同时会加入栈中,使用ctrl+z可撤销。

    [MenuItem("Tools/myDelete")]

   static void myDelete()

   {

       foreach(Object o in Selection.gameObjects)

       {

           //Object.DestroyImmediate(o);

           Undo.DestroyObjectImmediate(o);

       }

   }

(编辑器脚本只能使用DestroyImmediate)

相关操作:

  • DestroyObjectImmediate//可撤销的删除物体

  • RecordObject//记录之后物体的改变

  • RegisterCreatedObjectUndo//记录物体创建

 

控制菜单的可用性

添加一个路径同名的MenuItem,第二个参数isValidateFunction设为true,并设置一个bool型的方法。

当显示菜单时会检查这个方法,当返回false时不可用,true时可用。

建议方法后加validate(验证)作为验证方法。

当在hierarchy中添加菜单时,可用性都为真,但是返回假时不会执行方法。(是bug吧)

 

在组件上直接添加菜单选项

可以使用ContextMenu可以在通常的组件中添加菜单选项。

不需要在Editor中,不用引用UnityEditor,方法为非静态。

[ContextMenu("Renew")]

   void Renew()

   {

       Debug.Log("Renew work");

   }

 

给字段添加菜单

在字段前加[ContextMenuItem(string name, string function)]标签

第一个参数为菜单名,第二个是调用的方法。这个方法必须声明(可为私有)。

[ContextMenuItem("add value", "AddValue")]

public  int value=0;

void AddValue()

{

    value += 10;

}

 

创建向导面板

首先创建一个面板类,在Editor文件夹下

该类继承ScriptableWizard

使用ScriptableWizard.DisplayWizard(title);创建面板

  • T:面板类的类型

  • title:面板的标题

  • 一般将创建面板也放在面板类下方便查找,同时由于面板类继承ScriptableWizard,创建不用ScriptableWizard.DisplayWizard,直接DisplayWizard即可。

面板类的公有方法会显示在面板上,就像组件中一样。

using UnityEditor;

public class ValueChangeWizard : ScriptableWizard {

   [MenuItem("Tools/ChangeValue", false, 40)]

   static void OpenChangeValue(MenuCommand cmd)

   {

       DisplayWizard("Change Value");

   }

   //创建面板

   public int newValue = 1000;//公有方法会像组件中一样显示

   private int score=0;//私有方法不会显示

}

ps:Wizard是巫师的意思

面板类都有一个按钮creat,使用DisplayWizard的第二个参数改变显示名。

有一些默认的方法,自动在按下时调用:

   private void OnWizardCreate()

   {

   }//点击创建按钮调用,调用后默认关闭窗口

   private void OnWizardOtherButton()

   {

   }//点击其他按钮调用

   private void OnWizardUpdate()

   {

   }//打开或向导的值改变时调用

   private void OnSelectionChange()

   {

   }//每当选中物体发生更改时调用

//类似的消息方法还有一些,可以在API中查到。

 

面板类的提示信息

isValid//按钮是否可用

errorString//错误信息

helpString//帮助信息

createButtonName//creat按钮显示内容

otherButtonName//ortherButton显示内容

 

显示通知

(EditorWindow.)ShowNotification(GUIContent notification);

参数为一个GUIContent对象,

GUIContent(string text, Texture image, string tooltip);

可以设置文字text,图片image,tooltip

ShowNotification(new GUIContent("ShowNotification", new Texture2D(200,200), "tooltip"));

 

tooltip,可以作为标签加到字段前,用于设置悬浮时显示的提示信息。

[Tooltip("新的值")]

    public int ChangeValue = 10;

没搞懂怎么在消息提示中使用。

 

编辑器数据保存

EditorPrefs

使用方法与PlayerPrefs相同,不在重复

 

一些零碎的实用功能

EditorUtility中集成了一些实用的方法,主要是提示,信息框等。

EditorUtility.DisplayProgressBar(string title, string info, float progress);

参数:

  1. title 标题

  2. info 信息

  3. progress 0到1之间的一个值,表示进度。

每当进行一定步骤后,调用这个方法实现进度条。

以下是一个每次点击增加一点进度条的实现。

    int count = 0;

    private void OnWizardOtherButton()

    {

        EditorUtility.DisplayProgressBar("title", "info", count/10.0f);

        count++;

        if (count > 10)

        {

            EditorUtility.ClearProgressBar();

            count = 0;

        }

    }

 

创建窗口

使用EditorWindow,与 ScriptableWizard相似,创建时有些许不同。

可以使用OnGUI显示一些内容。

using UnityEditor;

using UnityEngine;

public class MyWindow : EditorWindow

{

    [MenuItem("Tools/MyWindow")]

    static void ShowMyWindow()

    {

        MyWindow window = EditorWindow.GetWindow();

        window.Show();

    }

    //打开这个窗口的命令

    private string name;

    private void OnGUI()

    {

        GUILayout.Label("string");//显示一个字符串

        name = GUILayout.TextField(name);//显示一个输入框

    }

}

 

特殊目录位置

下面是一些默认的排序优先级

 

你可能感兴趣的:(unity)