如何在Unity编辑器中添加你自己的工具

在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它。你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作出的任何动作,这些全部都是用编辑器脚本来实现的。

这篇教程假设你已经熟悉Unity的基本工作流程。如果你知道如何在编辑器中创建物体、预设、场景并且知道如何移动它们,知道如何添加组件,那么你可以开始本教程的学习了。

最终结果预览

让我们看一下我们做出的最终结果是什么样子: 
grid_color_change 
如你所见,我们会创建一个编辑器窗口,里面有一个颜色拾取器,我们可以用所选取的颜色来绘制网格。我们也能够创建和删除物体,把他们对齐到网格,并且能够撤销这些动作。


Step 1: Gizmos

首先我们来学习如何使用gizmo。这里有一些内置gizmo的例子: 
translate_gizmo 
你可能会经常在Unity中看到这个gizmo,因为它会为每一个拥有transform组件的物体绘制,因此基本上每一个被选中的物体都会有这个gizmo。 
box_collider_gizmo 
这是另一个gizmo,它能够让我们知道绑定在我们游戏对象上的BoxCollider的大小。

Step 2: 创建一个Grid脚本

创建一个C#脚本Grid.cs,我们用它来为一个物体绘制我们自己的gizmo;我们会在编辑器中绘制一个简单的网格(Grid)来作为一个例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
using  UnityEngine;
using  System.Collections;
 
public  class  Grid : MonoBehaviour
{
     void  Start()
     {
     }
 
     void  Update()
     {
     }
}


对于一个网格,我们需要添加2个变量:width和height

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  Grid : MonoBehaviour
{
     public  float  width = 32.0f;
     public  float  height = 32.0f;
 
     void  Start()
     {
     }
 
     void  Update()
     {
     }
}


为了在编辑器中绘图,我们需要使用OnDrawGizmo回调函数,因此让我们创建它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public  class  Grid : MonoBehaviour
{
     public  float  width = 32.0f;
     public  float  height = 32.0f;
 
     void  Start()
     {
     }
 
     void  Update()
     {
     }
 
     void  OnDrawGizmos()
     {
     }
}

 

Step 3: 绘制网格(Grid)

要绘制一个网格,我们需要一系列水平线和垂直线,并且还要知道编辑器摄像机(也叫场景摄像机)的当前位置以便我们知道我们应该把我们的网格绘制在什么地方。首先,把摄像机的位置保存在一个单独的变量中

1
2
3
4
void  OnDrawGizmos()
{
     Vector3 pos = Camera.current.transform.position;
}


如你所见,我们可以使用Camera.current引用来获取编辑器摄像机。 
现在,我们需要2个for循环来绘制水平线和垂直线。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void  OnDrawGizmos()
{
     Vector3 pos = Camera.current.transform.position;
 
     for  ( float  y = pos.y - 800.0f; y < pos.y + 800.0f; y += height)
     {
         Gizmos.DrawLine( new  Vector3(-1000000.0f, Mathf.Floor(y/height) * height, 0.0f),
                         new  Vector3(1000000.0f, Mathf.Floor(y/height) * height, 0.0f));
     }
 
     for  ( float  x = pos.x - 1200.0f; x < pos.x + 1200.0f; x += width)
     {
         Gizmos.DrawLine( new  Vector3(Mathf.Floor(x/width) * width, -1000000.0f, 0.0f),
                         new  Vector3(Mathf.Floor(x/width) * width, 1000000.0f, 0.0f));
     }
}

我们使用Gizmos.DrawLine()来绘制线。注意Gizmos类有很多绘制API,因此绘制一个cube或者sphere甚至是它们的线框这样的几何图元(primitive)都不成问题。如果需要,你也可以绘制一幅图片。

网格线应该是无限长的,但是float.positiveInfinityfloat.negativeInfinity似乎在绘制直线时不能正常工作,因此我们只是简单的放置一个任意的大数来替代它。同时,线的数量严格取决于我们在for循环中使用的常数;技术上来说,我们不应该在代码中放置这样的常数,但这仅仅是一个测试代码,所以无视它就好。

要观察网格,你需要创建一个空物体,然后把我们的脚本Grid.cs绑定到它上面: 
grid_gizmo

Step 4: 创建一个自定义的Inspector

接下来的工作就是自定义Inspector。我们需要创建一个编辑器脚本来做这件事。创建一个新的C#文件,命名为GridEditor。这个脚本需要放置在Editor文件夹中;如果你还没有一个Editor文件夹,那么现在就创建它吧。

1
2
3
4
5
6
7
8
using  UnityEngine;
using 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值