首页 > Unity3D频道 > 【Unity3D拓展编辑器】 > Unity3D研究院之在开始学习拓展编辑器(一)
2013
04-11

Unity3D研究院之在开始学习拓展编辑器(一)

Unity拥有非常丰富的拓展编辑器接口,如果是在网上下载过别人写的插件,你会发现为什么它的监测面板视图和普通的不一样?其实是他通过代码自己绘制的监测面板,这篇博文MOMO带大家来学习编辑器。如下图所示,这是我通过代码拓展的面板视图。

Unity3D研究院之在开始学习拓展编辑器(一) - 雨松MOMO程序研究院 - 1

 

 下一条简单的脚本,绑定挂在摄像机上。

 

如图所示,在监测面板视图中它是一个很普通的结构。

Unity3D研究院之在开始学习拓展编辑器(一) - 雨松MOMO程序研究院 - 2

 

下面我们需要在代码中动态的编辑它。请在你的Project视图中创建一个Editor文件夹,如果有的话就不用创建。把脚本MyEditor放进Editor文件夹中。

MyEditor.cs

 编辑器的用法非常简单,OnInspectorGUI()方法中可以绘制控件,EditorGUI和EditorGUILayout可创建编辑器控件,和GUI的用法非常相像。如图所示,在回到Test的面板中,新的面板已经映入眼帘。对于其它控件的使用,大家可以自行去API中查阅,。原理都差不多。

 

Unity3D研究院之在开始学习拓展编辑器(一) - 雨松MOMO程序研究院 - 3

 

值得一提的是C#语言提供了一个非常赞的方法,它可以让你的数据更加的安全,并且可以在Get Set方法中监听到你获取与赋值的操作,推荐使用这种方法。简单的改一下Test.cs

 

举例说明一下 [HideInInspector][SerializeField] 隐藏数据在面板,并且序列化。它可以帮我们永久保存数据,如果不加的话数值就会重置。就好比我先添加了一个贴图,一运行游戏刚刚添加的贴图就变成null了。

还是以texture为例,当我们使用texture对象的时候,它会进入get板块快获取私有变量pTexture的值。当编辑器更改texture的时候,会进入set版块,将数值保存在pTexture中。这样你的数据会更加安全,因为这里操作的是当前类中的一个私有变量。也可以在get/set版块中加入一些特殊的代码。

最后在update()或者OnGUI中就可以直接用texture 对象了。当然也可以是你定义的任意对象。

最后是本文的下载 http://vdisk.weibo.com/s/xbzrt

欢迎大家踊跃留言,一起讨论学习。

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 请问一下,momo,我想问有没有个东西是可以监测Unity挂载控件。比如我想在个Gameobject挂载个5.3.3版本的Image控件或创建一个Image对象时把它的Raycast Target设为false Unity3D研究院之在开始学习拓展编辑器(一) - 雨松MOMO程序研究院 - 1

  2. 请教一下,在UnityEditor开发过程中,在修改资源或着代码时,会出现重新编译,除Unity自带的数据类型和C#自带的基本数据类型外,其它如list,dictionary都会在重新编译的过程中被回收,请问这种情况要怎么处理?

  3. 雨松你好,我想请问下,我在Inspector中通过EditorGuiLayout.ObjectField扩展了一个功能,当我选中某个对象a,往这个ObjectField里拖拽了另一个对象b,但是当我取消选中a后再选中,之前ObjectField里已经拖拽过的对象b就没有了,这个有什么解决方法吗?尝试使用了[HideInInspector][SerializeField]也没有效果

      • 嗯,确实是犯傻了,后来解决啦,非常感谢。
        另外还想顺便请教一个问题,使用GuiLayout.BeginHorizontal来布局的组件,位置总是有点乱(例如一个label加一个ObjectField,ObjectField框的左侧位置总是跟系统本身的不一样),也尝试了设置GuiLayout.MinWidth或者GuiLayout.MaxWidth来约束,但是貌似跟Inspector里默认的那些属性排版有区别,特别是在拖拽Inspector框宽度的时候。

  4. 我想问一下。就是这个,EditorGUILayout.IntPopup,,我想做一个下拉菜单。继承的是Editor。 在这个下面执行的。public override void OnInspectorGUI()。面板上是显示了。但是下拉后,选择后没有反应,总是显示的默认的那一个。下面是我的代码。public class test : Editor{ public override void OnInspectorGUI() { Test t = (Test)target; int [] a = {1,2,3}; string [] b = {“a”,”b”,”c”}; t.w = EditorGUILayout.IntPopup(“aa”,1, b,a); }}

  5. 请教下,我在脚本中通过sprite.create来截取一个spritesheet中的一部分当作游戏对象,但是只有在游戏运行后才能看到效果,没运行时scene场景中还是spritesheet整张,我怎样做才能在修改完脚本中的变量后自动更新scene视图中的对象呢?

  6. 请问一下雨松大人,Transform组件中的rotation字段怎么用这个办法来处理,我试过position和scale都可以,但是rotation是四元数死活不行╮(╯▽╰)╭。

  7. 您好MOMO,我最近想编写一个Scene视图的菜单,仿照Maya的8方向快捷菜单做的在Maya默认情况下按住Shift键+鼠标右键能唤出8方向创建快捷键,此时拖动鼠标会有一根线从中心绘制到鼠标的位置以提示用户当前鼠标松开后可能会调用的指令是什么上述操作我已经完成了,但是最后一步,画线没想到什么好的办法,因为用Handles绘制线条是以世界坐标来绘制的,在该情况下又拿不到任何相机进行坐标转换,怎么办呢?

  8. 请教个问题,我按照你说的方法试了一下,出现两个错误,1parsing error.2 newline in constant , 我用3.5ob6 , 是否版本有问题?代码片段为Myeditor。

  9. Pingback: 阴茎增大助勃器

  10. 如果不加的话数值就会重置。就好比我先添加了一个贴图,一运行游戏刚刚添加的贴图就变成null了。此话何解,运行游戏不会把贴图置null吧。

  11. Pingback: 真人倒模名器大全

  12. Pingback: 安心亚 c字裤

  13. Pingback: t裤女

  14. Pingback: 丰胸的最快食疗方法

  15. Pingback: 吃什么可以很快丰胸

  16. Pingback: 金匮肾气丸治早泄

  17. Pingback: 高清电视棒