Unity实用功能之扩展编辑器-控件绘制(一)

1,084 阅读3分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

概述

Unity提供了非常丰富的拓展编辑器的接口,有的时候我们会看到网上许多大佬写的教程文章编辑器界面非常丰富,感觉很多功能都是我们的编辑器中所没有的,其实这些都是自己写的脚本,将编辑器进行了扩展,这样做的目的是,会使我们在日常的开发中使用起来非常方便。
使用Unity提供的接口,配合Unity中定义的一些特性,我们就可以非常的方便的按照自己的想法来定义我们的Unity编辑器,可以随心所欲。所以本篇文章主要介绍一下在Unity中如何进行编辑器的扩展,希望会对大家有所帮助。

功能实现

首先我们创建一个测试代码,用来进行测试:

public class EditorTest : MonoBehaviour
{
    public Rect rectValue;
    public Texture texture;
}

我们可以看到,这段代码在Inspector面板中显示如下

image.png 接下来我们就以此为例进行编辑器扩展。

重点:想要对Unity的编辑器进行扩展,首先创建的扩展代码要继承Editor

我们先美化一下这个窗口,可以看到,我们这个Texture窗口选择完图片没法进行预览,所以我们要绘制一个贴图槽,让我们选择的贴图能够直接显示出来。
Project面板的Assets下新建一个Editor文件夹,只有写的扩展脚本放入到Editor下才能够发挥作用,接着新建一个脚本,进行编辑器扩展。注意:一定要继承Editor

image.png 首先要引用using UnityEditor;命名空间,然后才能进行继承Editor

接下来要使用两个定制特性

  1. [CustomEditor(typeof(EditorTest))]
  2. [ExecuteInEditMode] CustomEditor标签的第二个参数必须为true,表示对继承于MonoBehaviour的子类都有效。
    ExecuteInEditMode可以使脚本在Play Mode以外的状态下被执行,[ExecuteEditMode]支持脚本在Edit Mode下运行。
using UnityEditor;

[CustomEditor(typeof(EditorTest))]
[ExecuteInEditMode]
public class MyEditor : Editor//继承Editor
{
}

接下来就是重载OnInspectorGUI方法,来进行对控件的绘制。

public override void OnInspectorGUI()
{
    
}

OnInspectorGUI方法内部,使用EditorGUILayout类中的两个静态方法RectFieldObjectField来进行具体的逻辑创建。

简单介绍下EditorGUILayout

EditorGUILayout:编辑器界面布局,是一个编辑器类,提供了一些Unity内置类或结构体的布局组件,比如为Color类型、Vector3类型等定义的组件,为编辑器在InspcctorEditorWindow中的扩展提供了很大的方便;

  • EditorGUILayoutGUILayout不同的是,它提供的是一些为专门的类型而封装的高级控件而不是一些基础组件,所以它的使用通常是用在一些变量的输入;
  • EditorGUILayout是对GUILayout的扩展,它主要用于InspectorEditorWindow中;
  • EditorGUIEditorGUILayout的区别:EditorGUIFixed排列,EditorGUILayout则是AutomaticEditorGUILayout中的方法分为了两大部分:
  • 一部分是各种控件类型,
  • 一部分则是对控件的组织排列; 更多更具体的内容可以查看 官方API

接下来继续编写代码
首先获取EditorTest类的实例

EditorTest editorTest = (EditorTest)target;

通过EditorGUILayout中的RectFieldRect参数的显示方式进行重新绘制

 editorTest.rectValue = EditorGUILayout.RectField("窗口坐标设置", editorTest.rectValue);

使用EditorGUILayout中的ObjectField绘制一个贴图槽,用来显示选择的贴图

editorTest.texture = EditorGUILayout.ObjectField("选择贴图", editorTest.texture, typeof(Texture), true) as Texture;

最终效果如下:

image.png

效果展示

编辑器扩展.gif

源码地址

GitHub下载地址:点击这里跳转下载

写在最后

本篇文章主要是介绍一下,Unity编辑器如何进行扩展,以便在开发过程中能够更加的方便,下一篇文章将继续介绍在Unity中如何对编辑器进行扩展,功能也非常实用,欢迎大家一块交流学习。