Unity实用功能之扩展编辑器-Scene视图扩展(三)

1,453 阅读3分钟

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

概述

前两篇文章分别介绍在在Unity中对编辑器进行控件绘制和窗口绘制。在Unity的编辑器区域中,还有一个十分重要的区域,那就是Scene视图,俗称的场景。
想要对Scene视图进行扩展,那么就一定要基于一个基础-对象来进行,也就是说,想要在Scene视图中显示某写扩展的内容,就必须在Hierarchy视图中选中一个当前Scene视图中的游戏对象才可以实现。而在Hierarchy视图中选择不同的游戏对象,也可以有不同的Scene效果。下面一起来看一下

功能实现

想要获取对象,首先要在对象身上做点标识,首先新建一个空脚本挂到对象身上。这里是创建了一个Cube,然后挂载了一个空脚本

image.png

接下来我们就要开始编写一个脚本,来实现在Scene视图中编辑游戏物体的功能。这个脚本呢,也是必须要继承Editor的,同样需要引用命名空间using UnityEditor;,并且脚本要放在Editor文件夹下。

using UnityEditor;

[CustomEditor(typeof(SceneTest))]
public class SceneEditor : Editor
{
    
}

接下来在OnGUI中进行绘制,可以开创建自己想要的功能了。但是前提是我们要得到test脚本的对象

SceneTest test = (SceneTest)target;

在对象上方绘制一个文本框,显示对象的位置信息,显示的格式为物体名称:物体位置
这里绘制文本框使用的是Handles.Label,和上一篇文章使用的EditorGUILauout.LabelField就有所不同了,一个是在Scene视图中,一个是在窗口中。

//绘制文本框
Handles.Label(test.transform.position + Vector3.up * 2, test.transform.name + ":" + test.transform.position.ToString());

效果如下

展示11.gif 接下来开始绘制UGUI显示信息
首选要有一个GUI绘制的开始,一般GUI的绘制是BeginGUI->BeginArea->EndArea->EndGUI。

 Handles.BeginGUI();

然后给我们要绘制的GUI划分一个显示区域

 GUILayout.BeginArea(new Rect(100, 100, 200, 200));

区域位置全部都设置好了,接下来就是实现功能了,先来一个按钮

//绘制按钮
if (GUILayout.Button("测试按钮"))
{
    Debug.Log("点击了Scene视图中的测试按钮!");
}

再来一个文本框,注意:这里的和上面的Handles.Label文本框右不一样了,不要弄混了

//绘制文本框
GUILayout.Label("Scene视图中的文本框!");

绘制完毕之后,一定要记得,要结束Area和GUI

//结束绘制
GUILayout.EndArea();
Handles.EndGUI();

到这里所有基本上也就结束了,编辑器扩展基本就这三种,控件绘制,窗口绘制,Scene视图扩展。

效果展示

一起来看一下最终效果如何

展示12.gif

源代码地址

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

写在最后

拓展Uniy的介绍基本上就完事了,在这个过程中使用了很多定制特性以及Unity编辑器提供的一些接口,希望能够通过这几篇文章,加深各位对定制特性以及编辑器拓展的理解,希望能够对大家有所帮助,也希望各位能够更方便快捷的使用Unity编辑器。
文章中如果有写的不妥的地方,欢迎指出,大家共同交流学习。