在运行时脚本中使用UnityEditor命名空间,假如该脚本被挂在场景中的物体上,那么:
可以这样做,在Unity编辑器中运行时也会正常运行,不会报错。但是当我们打包时会出现以下错误(不管该脚本有没有被挂在任何一个物体上,只要不是在Editor文件夹下,都会报错):
The type or namespace name`UnityEditor' could not be found. Areyoumissing a using directiveor an assembly reference?
为什么会这样呢?
因为Unity在发布游戏的时候不会使用UnityEditor命名空间的程序集UnityEditor.dll,自然就不能识别UnityEditor命名空间了。
所以说,UnityEditor命名空间及其中的编辑器类只能在编辑器中使用。
但上面的问题该如何解决呢?
原则上来说,运行时脚本和编辑器脚本应该分开放,编辑器脚本都放在“Editor”文件夹下面,这样打包时自然不会报错。
但我现在又希望在运行时脚本中使用UnityEditor,那么可以使用条件编译
对使用UnityEditor命名空间的语句或声明使用
#if UNITY_EDITOR
.......
#endif
这样UnityEditor命名空间及其类就只能在Unity编辑器环境下起作用了
Unity中各文件夹的编译顺序(转载)
对于每一种脚本语言,根据脚本放置的位置(其实也部分根据了脚本的作用,比如编辑器扩展脚本,就必须放在Editor文件夹下),Unity3D会生成4种后缀的工程。其中的firstPass就表示先编译,Editor表示放在Editor文件夹下的脚本。
下面以C#脚本为例。如果工程中只有C#脚本,不考虑为VS和MonoDevelop各自生成工程的差异性,我们可以得到4个工程文件:
Assembly-CSharp-firstpass-vs.csproj
Assembly-CSharp-Editor-firstpass-vs.csproj
Assembly-CSharp-vs.csproj
Assembly-CSharp-Editor-vs.csproj
(1) 所有在Standard Assets,Pro Standard Assets或者 Plugins文件夹中的脚本会产生一个Assembly-CSharp-firstpass-vs.csproj文件,并且先编译;
(2) 所有在Standard Assets/Editor, Pro Standard Assets/Editor 或这Plugins/Editor文件夹中的脚本产生Assembly-CSharp-Editor-firstpass-vs.csproj工程,接着编译;
(3) 所有在Assets/Editor外面的, 并且不在(1),(2)中的脚本文件(一般这些脚本就是我们自己写的非编辑器扩展的脚本)会产生Assembly-CSharp-vs.csproj工程,被编译;
(4) 所以在Assets/Editor中的脚本产生一个Assembly-CSharp-Editor-vs.csproj工程,被编译。
之所有这样建立工程并按此顺序编译,也是因为DLL间存在的依赖关系所决定的。
另外,我们在IDE中也可以看到对应名称的assembly,也就是dll
总结来说就是,特殊文件夹(Standard Assets。。)比一般文件夹优先编译(firstpass),run-time script比editor script优先编译。