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

这个插件就用到了今天我们学到的东西制作而成的:



最后唠嗑一下,今天的内容很简单,但是克森却花了那么大篇幅来介绍,更多的是照顾一些新手朋友,所以克森非常细节的介绍了一番。其实大伙们学到这里已经具备自己制作插件的能力了,要相信自己哟。

猜你喜欢

转载自blog.csdn.net/yongshuangzhao/article/details/80224569