Unity编辑器拓展【编辑器简介】

为什么要写Unity编辑器

Unity本身的功能已经很强大了,但是由于某些项目的特殊需求,需要拓展编辑器来提高工作效率,让程序去代替人工进行一些比较繁琐的操作,减少一些出错的可能性,比如我们可以写一些工具来定制更改动画曲线,也可以写工具来一键打包资源,压缩资源,检测资源冗余,统计资源信息等等。拓展编辑器也可以展示一些效果,比如人物模型的碰撞框可视化,地图网格AI的可视化等等,拓展编辑器也可以送入AssetStore进行售卖,获取经济收益。

Unity脚本的编译顺序

我们首先创建一个Unity项目,目录如下

Unity编辑器拓展【编辑器简介】

然后用VS打开,如下图,可以看到生成了四个工程文件,他们的编译顺序为①②③④的顺序

Unity编辑器拓展【编辑器简介】

  • ①所有在Standard Assets、Pro Standard Assets 或者 Plugins文件夹中的脚本会产生一个Assembly-CShap-firstpass-vs.csproj文件,并且先编译
  • ②所有在Standard Assets/Editor、Pro Standard Assets/Editor 或者 Plugins/Editor文件夹中的脚本会产生一个Assembly-CShap-Editor-firstpass-vs.csproj文件,并且先编译
  • ③所有在Assets/Editor外面的、并且不在上面两个文件夹中的脚本文件(一般这些脚本就是我们自己写的非编辑器拓展脚本),会产生Assembly-CShap-vs.csproj工程文件,被编译
  • ④所有在Assets/Editor中的脚本会产生一个Assembly-CShap-Editor-vs-csproj工程文件,被编译。

工程的引用关系

如果我们用Unity自带的MonoDevelop打开后,还可以发现上述4个工程之间的引用关系是这样的:

Unity编辑器拓展【编辑器简介】


Unity编辑器拓展【编辑器简介】


Unity编辑器拓展【编辑器简介】


Unity编辑器拓展【编辑器简介】

引用关系图:

Unity编辑器拓展【编辑器简介】

由此我们可以得出,我们写的一些Library库可以根据规则编译到Assembly-CSharp-fiistpass工程中,这样可以保证这个库是纯净的,不依赖于任何其他的工程。另外我们在Edito下写的代码不会被我们运行时候的代码使用到,因而在打包应用程序时,Assembly-CSharp-Editor和Assembly-CSharp-Editor-firstpass是不会被打包到应用程序中的。


Unity常用特殊目录

Resources

一般用来放置游戏运行时动态的资源,比如我们创建的一些特效,UI会放到这个目录下,运行时通过Resource.Load来加载这些资源。


StreamingAsset

这部分的内容在游戏发布的时候,会不经过任何处理地放到安装包里,一般放置视频,音频或者一些AssetBundle,这个目录在运行时是只读的,通过Application.streamingAssetsPath获取到。


Plugins

一般放置和平台相关的Native库,比如游戏中需要android里面的native弹框,那么我们可以用andriod导出 jar 包放到Plugins/Android目录下,也可以在Plugin下面创建Ios目录来放置一些ios的库.另外在Unity编译安装包的时候,会按照不同平台把不同目录下的内容放到不同的平台下,比如Android包里不会包含ios目录里面的内容。


Editor

一般放置和编辑器相关的脚本和资源,这些脚本只能在编辑器下使用,不会被打包到安装包里面。


Editor Default Resources

一般放置编辑器里面用到的动态资源,我们可以用EditorGUIUtility.Load来读取相关资源,这个目录要放置在Assets这个根目录下。


Gizmos

一般放置图片,图标icon,用于在Scene场景中给特定的gameObject显示特定的icon。