赞
踩
本文参自:
克森http://mp.weixin.qq.com/s/qxsKDPjJS30S9OXeQ8WKTw
本文为本人学习上链接的笔记微有改动,请点击以上链接查看原文,尊重楼主知识产权。
最终效果:
准备:
Scripts文件夹中创建C#脚本”MyHandles”,在Editor文件夹中创建C#脚本”HandleInspector”,将下小图标保存到Img文件夹中。
关于:Handles控制柄类
API传送门:
http://www.ceeger.com/Script/Handles/Handles.html
绘制半径操作柄:
首先打开我们的MyHandles.cs脚本,为其添加一个变量:
public float areaRadius; //半径
然后打开HandlesInspector.cs脚本添加:
using UnityEngine;
using System.Collections;
using UnityEditor;
[CustomEditor(typeof(MyHandles))]
public class HandlesInspector:Editor
{
MyHandles myHandles;
void OnEnable()
{
myHandles=(MyHandles)target;
}
public override void OnInspectorGUI()
{
DrawDefaultInspector();
}
private void OnSceneGUI()
{
//第一个参数为在场景中显示的位置(以物体的中心位置为基准)
//第二个参数为显示的名字
//用于在场景中显示设置的名字
Handles.Label(myHandles.transform.position+new Vector3(0,1,0),"MyHandles");
//第一个参数为该旋转操作柄的初始旋转角度
//第二个参数为操作柄显示的位置(以物体的旋转位置为基准)
//第三个参数为设置操作柄的半径
//用于在场景中显示半径操作柄
myHandles.areaRadius = Handles.RadiusHandle(Quaternion.identity,myHandles.transform.position,myHandles.areaRadius);
}
}
将这两个脚本保存,回到Unity中创建一个空物体,并为其添加 MyHandles.cs 脚本:
此时我们观察场景,除了场景中出了 “MyHandles” 几个字外,似乎啥事儿也没发生,不急,让我们来调整调整 Area Radius 参数的值,便能看到如下效果:
代码很简单,注释也给大家弄上了,相信大家都能看懂吧。还是不太懂的可以多看看API:
作用:这个东西是不是有点类型于碰撞体的那个框框啊,这玩意多用于制作AI,用于判断和指定UI影响范围用的。
绘制缩放操作柄:
打开 MyHandles.cs 脚本,添加如下变量:
public float size;//大小
然后为 HandlesInspector.cs 脚本添加如下代码:
参看API:
作用:多用于绘制一些自定义的操作,比如Unity的粒子系统就用到了好多自定义的操作柄,比如粒子系统的Shape参数就用到了该函数的第五个参数来绘制:
绘制位置操作柄:
打开 MyHandles.cs 脚本,添加如下变量:
然后为 HandlesInspector.cs 脚本添加如下代码:
效果:
参见API:
作用:这个可以用在AI上面,然后为每一个AI添加一个位置操作柄,这样好像看上去方便不少吧?
绘制旋转操作柄:
打开 MyHandles.cs 脚本,添加如下变量:
然后为 HandlesInspector.cs 脚本添加如下代码:
效果:
PS:nodePointsRotation的个数要与nodePoints的个数要相等或者小于nodePoints。
做一个操作,看看大伙们能不能看懂我想表达的意思:
是不是感觉像是静止一般,一动不动的呢?下面修改一下代码:
此时,你会看到如下的错误,不要慌张,我们只有越到错误,解决多了,那以后越到错误就不是什么可怕的事情了:
相信很多人都知道这个是什么错误吧,那是因为由三维向量转为四元素W的值不能为0,因此我们只要把W设置为1即可,如下所示:
这个操作呢,主要是帮大家找出一些开发过程中容易遗漏的错误,还有一个目的就是让坐标轴跟随着旋转而旋转(因为第二个参数是位置操作柄的旋转方向嘛,我把它改为了我们设置好的旋转方向,因此位置操作柄便能跟随着我们的旋转而旋转了)。
连接操作柄:
为 HandlesInspector.cs 脚本添加如下代码:
此时回到场景中便能看到如下所示:
这段代码呢,也很简单,可能有点不明白的也就是 Mathf.Repeat()函数,这个简单,看下图便能明白:
其实这样做的原因大伙们都知道,就是为了防止下标越界。
打开和关闭操作柄:
打开 MyHandles.cs 脚本,添加如下变量:
然后为 HandlesInspector.cs 脚本添加如下代码:
就是当showNodeHandles为false时便不执行 if 代码块里的代码,因此便无法绘制出位置操作柄和旋转操作柄咯,最终的效果如下:
绘制场景GUI:
为 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
这个插件就用到了今天我们学到的东西制作而成的:
文末:再次声明请尊重楼主版权:
克森http://mp.weixin.qq.com/s/qxsKDPjJS30S9OXeQ8WKTw
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。