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<T>(title);创建面板

  • T:面板类的类型

  • title:面板的标题

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

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

using UnityEditor;

public class ValueChangeWizard : ScriptableWizard {

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

   static void OpenChangeValue(MenuCommand cmd)

   {

       DisplayWizard<ValueChangeWizard>("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<MyWindow>();

        window.Show();

    }

    //打开这个窗口的命令

    private string name;

    private void OnGUI()

    {

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

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

    }

}

 

特殊目录位置

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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity编辑器拓展教程是一种自定义Unity编辑器功能的方法。通过扩展Unity编辑器,我们可以为开发者提供更方便、高效的开发环境。下面是一个简单的Unity编辑器拓展教程: 1. 创建一个自定义编辑器窗口:首先,我们可以创建一个新的C#脚本文件,并继承自EditorWindow类。在这个脚本中,我们可以自定义一个窗口,并在该窗口中进行编辑器拓展的操作。 2. 实现自定义窗口:在自定义的窗口脚本中,我们可以通过OnGUI函数来实现GUI的绘制和交互逻辑。在这里,我们可以添加自定义的按钮、文本框、滑动条等UI元素,并通过相应的回调函数来处理用户的输入和操作。 3. 使用 SerializedObject 和 SerializedProperty:SerializedObject 和 SerializedProperty 是Unity中的序列化类,通过使用它们可以方便地访问和修改Unity对象的属性。我们可以使用这些类来实现自定义窗口中的属性编辑功能。 4. 添加自定义菜单项和工具栏按钮:通过扩展Unity的菜单和工具栏,我们可以为自定义窗口添加快捷方式。我们可以使用菜单项和工具栏按钮的回调函数来打开我们定义的自定义窗口。 5. 实现其他功能:除了基本的UI绘制和属性编辑外,我们还可以通过Unity的API来实现其他更复杂的功能,如自定义Inspector面板、自定义资源管理等。 Unity编辑器拓展是一个很有用的功能,它可以帮助我们提高开发效率,定制开发流程和工作流程。通过学习和使用Unity编辑器拓展的技术,我们可以更好地适应项目的需求,并优化我们的开发过程。希望以上内容对您有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值