本文参自:
克森http://mp.weixin.qq.com/s/qxsKDPjJS30S9OXeQ8WKTw

本文为本人学习上链接的笔记微有改动,请点击以上链接查看原文,尊重楼主知识产权。


Unity Editor:Handles

最终效果:

准备:
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

Unity Editor 基础篇(四):Handles相关推荐

  1. Unity编辑器Unity Editor基础(一)

    Unity编辑器Unity Editor基础(一)               关于 Unity 内置属性可以从到官方文档中查询,本篇文章只介绍一些常用的内置属性,如下图所示: 接下来进行项目设置,创 ...

  2. 前端开发之JavaScript基础篇四

    主要内容: 1.定时器 2.正则表达式入门 3.元字符 4.正则表达式实战运用 一.定时器 javaScript里主要使用两种定时器,分别是:setInterval()和setTimeout(). 1 ...

  3. 转载:谢谢原作者:块设备驱动实战基础篇四 (逐渐成型,加入ioctl通信机制)

    1.6介绍一种内核与用户空间通信的方法-misc设备ioctl机制 块设备驱动开发中往往需要配合用户态的管理程序工具,管理我们的块设备,此时我们需要涉及用户空间程序与块设备通信的方法,ioctl机制就 ...

  4. kafka基础篇(四)——kafka消费者客户端

    一.入门程序 先上代码,从代码入手,讲解kafka消费者客户端的细节. public class HelloKafkaConsumer {public static void main(String[ ...

  5. java程序试岗内容_java程序员修炼之路基础篇四:继承

    上一篇文章我跟大家聊了一下"封装",今天我们聊一下同样作为java语言三大特征之一的"继承". 简单说"继承"就是从一个已知类派生出新类的过 ...

  6. c if语句多个条件判断顺序_Java中的流程控制语句 (基础篇四)

    流程控制就是对事物次序的布置和安排,在程序中就是对代码执行次序的安排和控制 程序中的流程控制主要有三种:顺序流程.选择流程.循环流程. 顺序流程:比如打印输出的代码按照指定的顺序结构依次排序,打印的结 ...

  7. java中的四个跳转语句_Java中的流程控制语句 (基础篇四)

    流程控制就是对事物次序的布置和安排,在程序中就是对代码执行次序的安排和控制 程序中的流程控制主要有三种:顺序流程.选择流程.循环流程. 顺序流程:比如打印输出的代码按照指定的顺序结构依次排序,打印的结 ...

  8. 测试需要了解的技术之基础篇四__UI自动化测试体系

    UI自动化测试体系 1.Andriod 自动化测试:Appium 环境安装与架构介绍.Appium Desktop用例录制.Appium测试用例流程.元素定位方法 IA/AID/XPATH/UISel ...

  9. oracle职工工资数据表四表联动,oracle 学习之基础篇(四):多表查询

    员工表emp和部门表dept的笛卡尔集(笛卡尔集表=列数之和,行数之积,笛卡尔集表内中有些数据是不符合要求的)select emp.ename,dept.dname from emp,dept; 使用 ...

最新文章

  1. 随机森林 java_机器学习weka,java api调用随机森林及保存模型
  2. (4)关于Alpha通道问题
  3. 皮一皮:同一样物件,不一样的时间...
  4. 自建Hive数据仓库跨版本迁移到阿里云Databricks数据洞察
  5. 智能情绪分析技术_简单分析人工智能的表现在计算机网络应用技术中的优势
  6. 数组长度属性以及JavaScript中的示例
  7. ai直线怎么变折线_如何在 AI中设计可编辑折线图
  8. 抖音回应李小璐PGone视频曝光:草稿视频不会上传到后台
  9. 13.深入分布式缓存:从原理到实践 --- 缓存在社交网络Feed系统中的架构实践
  10. JedisConnectionException: Failed connecting to host localhost:6379
  11. html网页设计课程心得,网页设计教学心得体会
  12. go kegg_GO分析和KEGG分析都是啥?
  13. LA 3713 Astronauts
  14. 学之思考试系统安装详细教程
  15. AntV-G6实现微服务拓扑图
  16. 数据结构与算法——时间与空间复杂度
  17. undefined reference to 'function'及解决办法
  18. 基于Python的超市管理系统毕业设计源码111042
  19. 华雨欢:行情开启上行走势,区间突破指日可待
  20. 人生观、价值观、世界观

热门文章

  1. SAS比较不同年龄段组间差异,卡方检验
  2. Cesium|xt3d gltf标绘绘制编辑
  3. 树莓派简单配置samba,共享文件
  4. 专家建议恢复五一黄金周或者设新长假-全国假日办-五一假期-国家旅游局
  5. 用c语言编写振铃检测程序,单片机检测电话振铃程序
  6. gwas snp 和_gwas
  7. 爬虫 豆瓣音乐 top250
  8. 什么是伪数组 以及伪数组转真数组的方法
  9. 201X年度·微信个人收藏精选集(二)
  10. Kalilinux安装Genymotion