请选择 进入手机版 | 继续访问电脑版
声明:
    题图来自于Unity3D Demo Adam欢迎分享本文本文未经允许不能以任何形式转载。

在制作游戏(应用)时,很多时候不能把所有对象堆放到场景里,因为这样,场景的加载和实例化会非常慢,会有明显的卡顿感觉。在这种情况下就需要有顺序的初始化场景的对象,例如地面会在一开始初始化,小草石头等小物件放后面,场景上粒子特效(小草上冒起的光点等)放到最后。
那小草和特效应该放置在哪个位置呢、应该旋转多少度、缩放多少呢,这个时候我们可能需要定制一个组件:锚点
这里所说的锚点(Anchor)相对于网页制作中的锚点只有记录坐标、旋转、缩放和层级(parent是谁)等Transform组件内容的作用。
既然用于记录Transform内容,那么使用空的GameObject或者使用Cube等组件就行了,为什么要定制一个锚点组件呢? 这里说说他们的优缺点。
空GameObject: 只有在选中对象时候,才会显示相应坐标轴、旋转轴、缩放轴,而且一次只能选择一个轴,非常的不方便。
Cube等基础物体: 相对于空GameObjectCube比较直观的能观察到变换,可缺点也很明显,自带的MeshFilterMeshRendererBoxCollider等组件会降低运行效率。
自定义锚点组件: 在使用以上两种方案都感到不方便的时候,我们就需要创建一种编辑状态拥有可视化图像可以变换的,并且在运行状态不会影响效率的锚点组件。利用编辑器的Handles类在Scene界面绘制线框。
Unity3D插件开发教程(一):自定义锚点组件-1.jpg
Editor入门要点: Unity编译器扩展的开发有如下规定,如果是编辑器脚本,你需要在Editor文件夹下创建你的插件代码,项目中任何目录下创建的Editor文件夹都会被编译成编译器使用的代码。 ps:插件开发最好有一套自己的分类管理,方便管理和修改,例如很多人喜欢把所有插件放置在Plugin目录下。
好了,下面开始教你如何自定义锚点组件

知识要点:
    EditorHandlesMenuItem
    Selection

使用版本:
    Unity3D 5.3.3
目标:
    使用Handles类在Scene视图绘制一个正方体
整个插件的结构:
Unity3D插件开发教程(一):自定义锚点组件-2.png

首先我们在AnchorComponent目录下创建一个AnchorComponent.cs代码(注意命名空间可能会报错,可以修改一下命名空间)。
AnchorComponent.cs就是我们要实现的锚点组件了。它只有简单几个属性用于记录锚点的参数。所以在运行时并不会对效率产生多大的影响。
  1. [/code] Unity3D插件开发教程(一):自定义锚点组件-3.jpg
  2. 以上的属性待会在使用到的时候会一一给予介绍。
  3. 然后我们[b]在AnchorComponent/Editor[/b]文件夹下创建[b]AnchorComponentEditor.cs[/b]代码,此代码用于在Scene视图上绘制线框。
  4. [code]
复制代码
AnchorComponentEditor需要继承Editor类,扩展SceneHierarchyInspector等视图的插件都需要继承Editor类,并创建特定的函数用于相应的扩展。
例如,本文需要在Scene视图上绘制,则要创建OnSceneGUI函数。并且在OnSceneGUI函数里书写绘制逻辑。
接着在类的声明前加入[CustomEditor(Type t)],这是要告诉编辑器,我这个编辑类是给哪个组件使用的。
然后我们要在上面的OnSceneGUI函数里添加如下代码。
  1. [/code]Editor类的target属性可以获取到你正在选择操作的组件。当然,要强制性转换成相应的组件类才能使用。
  2. [b]Handles类:[/b] 包含了大量在Scene视图绘制直线、弧线、锥体、圆等基础图形的函数。
  3. [b]Handles.color: [/b]很好理解,就是设置接下来绘制的对象的颜色。
  4. [b]Handles.CubeCap: [/b]绘制一个实心的正方体,这里会介绍到是因为可能有人比较喜欢看实心的正方体。
  5. 接下来是绘制线框正方体,由于逻辑比较多,所以另外写成一个函数[b]DrawWireframeBox[/b]。
  6. [quote]PS:5.4版本后,Handles新增了绘制线框正方体DrawWireCube的方法,由于暂无接触,所以这里不多介绍,使用5.4版本的童鞋可以实践下[/quote][code]
复制代码
由于这部分代码比较多,所以分开一块块来解释。
  1. [/code]接下来就是设置8个点了,代码就不重复贴了,如果对8个点的位置没有概念,可以使用后面注释了的[b]Handles.Label[/b]把索引显示出来,可以直观看出效果如何。
  2. Unity3D插件开发教程(一):自定义锚点组件-4.png
  3. 接下来是绘制12根线,这里由于比较直观让大家知道对应的线的位置,所以使用[b]DarwLine[/b]来一根根画出来。
  4. 接下来的就是超纲内容了,跟锚点没关系的了。 就是,每次生成锚点的时候都要添加一个[b]GameObject[/b],然后挂一个锚点组件好像比较麻烦哦。 那么就可以把锚点组件加入到菜单里。
  5. 首先在[b]AnchorComponent/Editor[/b]文件夹下创建[b]AnchorComponentMenu.cs[/b]代码,用于增加添加锚点组件的菜单选项。
  6. [code]
复制代码
MenuItem是Unity添加菜单的类,使用方法之一(后面会教其他方法)就是在static函数上面增加MenuItem特性(Attribute)。
    第一个参数:菜单的地址,我们使用GameObject/3D Object,因为Hierarchy视图中的菜单一级目录是Unity默认绘制的,如果不想整个菜单重写,那么只能使用一个二级目录。第二个参数:作用未知,但设成true显示不出来。第三个参数:菜单的优先级,值越大,排的越后。使用10000可以保证在默认组件最后。
然后在函数里创建一个GameObject,然后为其添加锚点组件。 接着使用Selection.activeObject属性获取当前选择的对象,然后把新建的锚点添加到选择对象的子级。
最后,放上源代码。
https://github.com/L-Lawliet/UnityEditorTutorial/tree/master/AnchorComponent
==========================分割线==========================
这篇文章从开始到最后足足改了三版,由于第一次写教程,废话比较多,所以把整篇删了再写,然后写完发觉有地方遗漏了,又修修补补改了很多。
如果大家有什么意见和建议,或者是有什么疑问,或者是有想看的知识点内容,都欢迎到评论区发上你们的评论。
最后我希望有更多人参与到插件开发的队伍里。也欢迎大家投稿。
QQ群:234204968
分享到 :
0 人收藏

2 个回复

倒序浏览
高冷逗比  中级会员 | 2018-11-9 09:45:33
很清晰,谢谢分享。求关于预置体嵌套的教程。
残月  中级会员 | 2018-11-9 09:45:33
谢谢,我先看看如何实现嵌套是比较好的,到时候写好了@你啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|翁笔

© 2001-2018 Wengbi.com

返回顶部