Unity Editor 基础篇(四):Handles
源地址:http://gad.qq.com/article/detail/33465
由于太久不更新,之前的项目不知道跑哪儿去了。让我们重新创建一个新的项目,命名为“MyHandles”。然后创建三个文件夹,如下图所示:
接下来在Scripts文件夹中,创建一个C#脚本,并命名为“MyHandles”;然后在Editor文件夹中再创建一个C#脚本,命名为“HandlesInspector”;然后在将下面的小图标保存到Img文件夹中:
小图标
好了准备工作就绪,开始码了个码。
在这篇教程中,我们主要用到 Handles 这个类,以下是Handles 类的基本介绍,并会挑出几个比较常用的属性和方法来制作一下简单的东西,其它属性和方法大伙们可以自行去尝试尝试:
API传送门:http://www.ceeger.com/Script/Handles/Handles.html
首先打开我们的 MyHandles.cs 脚本,为其添加一个变量:
然后打开 HandlesInspector.cs 脚本,添加如下代码:
将这两个脚本保存,回到Unity中创建一个空物体,并为其添加 MyHandles.cs 脚本:
此时我们观察场景,除了场景中出了 “MyHandles” 几个字外,似乎啥事儿也没发生,不急,让我们来调整调整 Area Radius 参数的值,便能看到如下效果:
代码很简单,注释也给大家弄上了,相信大家都能看懂吧。还是不太懂的可以多看看API:
作用:这个东西是不是有点类型于碰撞体的那个框框啊,这玩意多用于制作AI,用于判断和指定UI影响范围用的。
打开 MyHandles.cs 脚本,添加如下变量:
然后为 HandlesInspector.cs 脚本添加如下代码:
这段代码呢也不难于理解,就是参数多了点,不过克森已经做了详细的代码注释,至于最后一个参数嘛,克森暂时还真不知道用来干什么的。
PS:由于中文版的介绍不全,所以补了一张官方的API。
作用:多用于绘制一些自定义的操作,比如Unity的粒子系统就用到了好多自定义的操作柄,比如粒子系统的Shape参数就用到了该函数的第五个参数来绘制:
大伙们可以自行去嗨一嗨。
绘制位置操作柄
打开 MyHandles.cs 脚本,添加如下变量:
然后为 HandlesInspector.cs 脚本添加如下代码:
回到场景中,此时大伙们会碰到这样的问题:
别担心,那是因为你没有设置 nodePoints 属性,所有该函数访问到一个空的数组,因此便报出了老司机错误。如下图所示便OK:
这段代码简单了吧,也就两个参数,如果还是不清楚的小伙伴可以多尝试尝试。
作用:克森的理解,这个可以用在AI上面,然后为每一个AI添加一个位置操作柄,这样好像看上去方便不少吧?
绘制旋转操作柄
打开 MyHandles.cs 脚本,添加如下变量:
然后为 HandlesInspector.cs 脚本添加如下代码:
同样的,会出现上面类似的错误,甚至更加严重,Scene视图直接白屏!!使用同样的解决方法即可,如下所示:
PS:nodePointsRotation的个数要与nodePoints的个数要相等或者小于nodePoints。
这段代码同样很简单了吧,也是两个参数,如果还是不清楚的小伙伴可以多尝试尝试。
克森做一个操作,看看大伙们能不能看懂我想表达的意思:
是不是感觉像是静止一般,一动不动的呢?下面跟着克森修改一下代码:
此时,你会看到如下的错误,不要慌张,我们只有越到错误,解决多了,那以后越到错误就不是什么可怕的事情了:
相信很多人都知道这个是什么错误吧,那是因为由三维向量转为四元素W的值不能为0,因此我们只要把W设置为1即可,如下所示:
克森的这个操作呢,主要是帮大家找出一些开发过程中容易遗漏的错误,还有一个目的就是让坐标轴跟随着旋转而旋转(因为第二个参数是位置操作柄的旋转方向嘛,我把它改为了我们设置好的旋转方向,因此位置操作柄便能跟随着我们的旋转而旋转了)。
连接操作柄
为 HandlesInspector.cs 脚本添加如下代码:
此时回到场景中便能看到如下所示:
这段代码呢,也很简单,可能有点不明白的也就是 Mathf.Repeat()函数,这个简单,看下图便能明白:
其实这样做的原因大伙们都知道,就是为了防止下标越界。
打开和关闭操作柄
打开 MyHandles.cs 脚本,添加如下变量:
然后为 HandlesInspector.cs 脚本添加如下代码:
其实也很容易理解,就是当showNodeHandles为false时便不执行 if 代码块里的代码,因此便无法绘制出位置操作柄和旋转操作柄咯,最终的效果如下:
为 HandlesInspector.cs 脚本添加如下代码:
回到场景便能看到如下图所示的界面:
这段代码呢,其实也很简单,不过是运用了两对函数。
第一对为:Handles.BeginGUI() 和 Handles.EndGUI()。这对函数表名你想要在Scene视图下绘制东西。
第二对为:GUILayout.BeginHorizontal() 和 GUILayout.EndHorizontal()。这对函数表明你想要以水平方向绘制东西。相信第二对函数大伙们都不陌生吧,记得在《Unity Editor 基础篇(三):Editor Window》中有介绍过。
里面的逻辑代码也很简单,那就是绘制一个按钮,当我点击时让 MyHandles.shoNodeHandles的值取反(也就是原来为true,点击后取反,便为false)。
补充:在第一对函数里得操作和自定义窗口里得操作几乎相同,大家可以参考下面得API去尝试尝试:
http://www.ceeger.com/Script/GUILayout/GUILayout.html
这个插件就用到了今天我们学到的东西制作而成的:
最后唠嗑一下,今天的内容很简单,但是克森却花了那么大篇幅来介绍,更多的是照顾一些新手朋友,所以克森非常细节的介绍了一番。其实大伙们学到这里已经具备自己制作插件的能力了,要相信自己哟。