Unity编辑器扩展-基本界面编写

2022-08-07 12:35:49

一.在编辑器上增加一个MenuItem

先进行第一步,给编辑器加个菜单,通过[MenuItem("AXX/BXX")]就可以在编辑器的上边菜单栏增加一个下拉菜单AXX,并增加一个按钮BXX。只要把这句话写在我们定义的函数上方就可以,然后我们点击这个按钮,就会调用这个我们自定义的函数。不过有一点一定要记住,这个函数要是static的!(想一想就可以知道是为什么,编辑器没有必要搞粗一个对象之类的,因为我们要调用的只是这个方法)例如:

using UnityEngine;
using UnityEditor;
using System.Collections;

public class EditorTest
{
    [MenuItem("MyTools/EditorTest")]
    public static void ConfigDialog()
    {
        Debug.Log("EditorTest ToolButton is pressed!");
    }
}

我们的编辑器就多了这样的一个工具选项MyTools,点击出现了EditorTest下拉菜单,再点击按钮就会输出Log了,如下图所示:

二.创建一个对话框

如果我们嫌这个一个下拉菜单不爽,那我们就可以创建一个对话框,然后就可以在对话框里放更多的按钮或者一些工具条来调节相关内容,下面看一下在Unity编辑器中对话框的创建以及使用。
using UnityEngine;
using UnityEditor;
using System.Collections;

//typeof(编辑器类名),继承EditorWindow
[CustomEditor(typeof(EditorTest))]
public class EditorTest : EditorWindow
{
    //通过MenuItem按钮来创建这样的一个对话框
    [MenuItem("MyTools/EditorTest")]
    public static void ConfigDialog()
    {
        //GetWindow创建
        EditorWindow.GetWindow(typeof(EditorTest));
    }

    public UnityEngine.Object go = null;

    //对话框中的各种内容通过OnGUI函数来设置
    void OnGUI()
    {
        //Label
        GUILayout.Label("Label Test", EditorStyles.boldLabel);
        //通过EditorGUILayout.ObjectField可以接受Object类型的参数进行相关操作
        go = EditorGUILayout.ObjectField(go, typeof(UnityEngine.Object), true);
        //Button
        if (GUILayout.Button("Button Test"))
        {
            Debug.Log(go.name);
        }
    }
   
}
结果如下:

通过这样的一个脚本,我们就可以在Unity中创建一个对话框,然后再在对话框里进行进一步的设置。

三.扩展Inspector面板

这一部分比较重要,也是我们最经常使用的部分。

1.ContextMenu

比如我们写了个脚本,但是有一些函数需要调用触发,测试的时候又不方便,一种方法是重写MonoBehaviour类的OnGUI方法,但是这种方法也比较笨,要写好多代码,除非真机调试的时候,没有办法才这样做,我们可以通过一种更简单的方式来实现。
我们如果想直接调用我们继承MonoBehaviour的类的某个函数,只需要在函数上加上[ContextMenu(“函数名称”)]即可:
[ContextMenu("Context Menu Test")]
    void OnTest()
    {
        Debug.Log("Context Menu is called");
    }
结果如下:

通过ContextMenu,我们可以更方便地测试我们的脚本,随时通过编辑器调用我们的函数,而不用再去其他外层函数。

2.自定义inspector面板

有时,我们需要更加方便美术或者策划来编辑对象属性,这时候,我们就可以通过自定义Inspector面板来进行控制:
using UnityEngine;
using UnityEditor;
using System.Collections;

//typeof中参数即为我们需要定义Inspector面板的组件
[CustomEditor(typeof(CustomEditorTest))]
public class TestCustomEditor : Editor {

    CustomEditorTest script;

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        //将target转化为我们需要的脚本
        script = target as CustomEditorTest;
        //增加一个按钮
        if (GUILayout.Button("Test Button"))
        {
            //可以直接访问CustomEditorTest类的内容
            script.Test(script.num);
        }
    }
}
结果:

四.编辑器插件常用函数

1.AssetDatabase.CreateAsset可以帮住你从资源目录中创建一个资源实例。
2.Selection.activeObject返回当前选中的对象。
3.EditorGUIUtility.PingObject用来实现在Project窗口中点击某一项的操作。
4.Editor.Repaint用来重绘界面所有的控件。
5.XXXImporter用来设置某种资源的具体导入设置(例如在某些情况下你需要设置导入的贴图为可读的)。
6.EditorUtility.UnloadUnusedAssets用于释放没有使用的资源,避免你的插件产生内存泄漏。
7.Event.Use用来标记事件已经被处理结束了。
8.EditorUtility.SetDirty用来通知编辑器数据已被修改,这样在下次保存时新的数据将被存储。

六.参考链接

Unity3D编辑器插件编写_脱莫柔的博客-CSDN博客

Unity3D 场景编辑器扩展学习笔记-Editor_kun1234567的博客-CSDN博客_unity 场景编辑器

【风宇冲】Unity3d编辑器拓展_风宇冲_新浪博客

  • 作者:puppet_master
  • 原文链接:https://blog.csdn.net/puppet_master/article/details/51012298
    更新时间:2022-08-07 12:35:49