在运行时脚本中使用UnityEditor命名空间

在运行时脚本中使用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优先编译。


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值