前言
在默认情况下,根据脚本在项目中的文件夹,会分成四个阶段编译脚本。
当脚本引用在其它阶段 (即位于不同程序集中) 编译的类时,编译顺序非常重要。
基本规则是,在当前编译阶段之后的任何编译阶段都不能被引用。在当前阶段或更早阶段编译的任何内容都是完全可用的。
编译的各个阶段如下:
阶段 | 程序集名 | 脚本文件 |
---|---|---|
1 | Assembly-CSharp-firstpass | Standard Assets, Pro Standard Assets 和 Plugins 文件夹下面的运行时脚本 |
2 | Assembly-CSharp-Editor-firstpass | Standard Assets, Pro Standard Assets 和 Plugins 文件夹下面的 Editor 文件夹下面的 Editor 脚本 |
3 | Assembly-CSharp | 其它不在 Editor 文件夹下面的脚本 |
4 | Assembly-CSharp-Editor | 所有剩下Editor 文件夹下面的脚本 |
Assembly definitions
程序集是一个 C# 代码库,它包含由脚本定义的已编译类和结构,还定义了对其他程序集的引用。
默认情况下,Unity 将几乎所有的游戏脚本编译到预定义的程序集中(Assembly-CSharp.dll)。
这种安排对于小型项目来说是可以接受的,但是当你向项目中添加更多代码时,会有一些缺点:
每当你改变一个脚本时,Unity 就必须重新编译所有其他脚本,这增加了迭代代码更改的整体编译时间。
任何脚本都可以直接访问任何其他脚本中定义的类型,这使得重构和改进代码变得更加困难。
所有脚本都是为所有平台编译的。
这里说一下程序集的特点
程序集可以被其他引用,但是只能访问你你为其添加的其他程序集中的脚本。
也就是说你不让访问的他都不能访问,或者这样说它不依赖别人。所以当编译的时候只要它不变就不会被再编译。这样就减少了编译的脚本。
每个程序集都被被编译为一个DLL。
我们常把多个项目之间可以通用的脚本放在程序集中。
另外
自定义的Assembly definitions下的Editor下的脚本不会再生成新的程序集,都在我们的自定义程序集下。
定义的方式
在我们要定义程序集的文件夹上右键 Create
=>Assembly Definitions
属性
其中
Root Namespace
命名空间 可以不填。
Define Constraints
添加预定义宏,读取预定义宏之后才编译,可以不填。
Assembly Definition References
程序集的依赖,依赖的程序集必须被添加才能在该程序集中使用。