这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
概述
前两篇文章分别介绍在在Unity中对编辑器进行控件绘制和窗口绘制。在Unity的编辑器区域中,还有一个十分重要的区域,那就是Scene视图,俗称的场景。
想要对Scene视图进行扩展,那么就一定要基于一个基础-对象来进行,也就是说,想要在Scene视图中显示某写扩展的内容,就必须在Hierarchy视图中选中一个当前Scene视图中的游戏对象才可以实现。而在Hierarchy视图中选择不同的游戏对象,也可以有不同的Scene效果。下面一起来看一下
功能实现
想要获取对象,首先要在对象身上做点标识,首先新建一个空脚本挂到对象身上。这里是创建了一个Cube,然后挂载了一个空脚本
接下来我们就要开始编写一个脚本,来实现在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());
效果如下
接下来开始绘制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视图扩展。
效果展示
一起来看一下最终效果如何
源代码地址
GitHub下载地址:点击这里跳转下载
写在最后
拓展Uniy的介绍基本上就完事了,在这个过程中使用了很多定制特性以及Unity编辑器提供的一些接口,希望能够通过这几篇文章,加深各位对定制特性以及编辑器拓展的理解,希望能够对大家有所帮助,也希望各位能够更方便快捷的使用Unity编辑器。
文章中如果有写的不妥的地方,欢迎指出,大家共同交流学习。