当前位置:   article > 正文

Unity Editor 基础篇(四):Handles_unity handles

unity handles

本文参自:
克森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; //半径
  • 1

然后打开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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

将这两个脚本保存,回到Unity中创建一个空物体,并为其添加 MyHandles.cs 脚本:

此时我们观察场景,除了场景中出了 “MyHandles” 几个字外,似乎啥事儿也没发生,不急,让我们来调整调整 Area Radius 参数的值,便能看到如下效果:

这里写图片描述

代码很简单,注释也给大家弄上了,相信大家都能看懂吧。还是不太懂的可以多看看API:
这里写图片描述

这里写图片描述

作用:这个东西是不是有点类型于碰撞体的那个框框啊,这玩意多用于制作AI,用于判断和指定UI影响范围用的。


绘制缩放操作柄:

打开 MyHandles.cs 脚本,添加如下变量:

public float size;//大小
  • 1

然后为 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/116623
推荐阅读
相关标签
  

闽ICP备14008679号