在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它。你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作出的任何动作,这些全部都是用编辑器脚本来实现的。
这篇教程假设你已经熟悉Unity的基本工作流程。如果你知道如何在编辑器中创建物体、预设、场景并且知道如何移动它们,知道如何添加组件,那么你可以开始本教程的学习了。
最终结果预览
让我们看一下我们做出的最终结果是什么样子:
如你所见,我们会创建一个编辑器窗口,里面有一个颜色拾取器,我们可以用所选取的颜色来绘制网格。我们也能够创建和删除物体,把他们对齐到网格,并且能够撤销这些动作。
Step 1: Gizmos
首先我们来学习如何使用gizmo。这里有一些内置gizmo的例子:
你可能会经常在Unity中看到这个gizmo,因为它会为每一个拥有transform
组件的物体绘制,因此基本上每一个被选中的物体都会有这个gizmo。
这是另一个gizmo,它能够让我们知道绑定在我们游戏对象上的BoxCollider
的大小。
Step 2: 创建一个Grid脚本
创建一个C#脚本Grid.cs,我们用它来为一个物体绘制我们自己的gizmo;我们会在编辑器中绘制一个简单的网格(Grid)来作为一个例子。
对于一个网格,我们需要添加2个变量:width和height
为了在编辑器中绘图,我们需要使用OnDrawGizmo
回调函数,因此让我们创建它。
Step 3: 绘制网格(Grid)
要绘制一个网格,我们需要一系列水平线和垂直线,并且还要知道编辑器摄像机(也叫场景摄像机)的当前位置以便我们知道我们应该把我们的网格绘制在什么地方。首先,把摄像机的位置保存在一个单独的变量中
如你所见,我们可以使用Camera.current
引用来获取编辑器摄像机。
现在,我们需要2个for循环来绘制水平线和垂直线。
我们使用Gizmos.DrawLine()
来绘制线。注意Gizmos
类有很多绘制API,因此绘制一个cube或者sphere甚至是它们的线框这样的几何图元(primitive)都不成问题。如果需要,你也可以绘制一幅图片。
网格线应该是无限长的,但是float.positiveInfinity
和float.negativeInfinity
似乎在绘制直线时不能正常工作,因此我们只是简单的放置一个任意的大数来替代它。同时,线的数量严格取决于我们在for
循环中使用的常数;技术上来说,我们不应该在代码中放置这样的常数,但这仅仅是一个测试代码,所以无视它就好。
要观察网格,你需要创建一个空物体,然后把我们的脚本Grid.cs绑定到它上面:
Step 4: 创建一个自定义的Inspector
接下来的工作就是自定义Inspector。我们需要创建一个编辑器脚本来做这件事。创建一个新的C#文件,命名为GridEditor。这个脚本需要放置在Editor文件夹中;如果你还没有一个Editor文件夹,那么现在就创建它吧。