Unity程序集
对于Unity的程序集,具体内容可以参考Unity官方文档,程序集定义
- 预定义程序集
比如Unity的默认程序集,Assembly-CSharp.dll,还有其他的比如 Assembly-CSharp-Editor.dll,Assembly-CSharp-firstpass.dll
没有指定或不在特殊文件夹内的脚本都属于这个程序集
- 特殊文件夹
1. Editor
在Editor文件夹下的脚本,默认会属于Assembly-CSharp-Editor.dll程序集,除非自定义程序集
2. Plugins
在Plugins文件夹下的脚本默认属于Assembly-CSharp-firstpass.dll程序集,除非自定义程序集
- 程序集定义引用,Assembly Definition Reference
即Assembly Definition Reference
官方解释为
什么意思呢?试验一下
此时脚本默认属于Assembly-CSharp-Editor.dll
接下来创建一个Assembly Definition Reference,并且指定程序集引用为UniTask
发现此时脚本的所属程序集变成了UniTask.dll,所以这里的意思就是Assembly Definition Reference会修改原来脚本所属的程序集
而当脚本已经属于一个自定义程序集时,就不能再指定一个Assembly Definition Reference了
此时脚本属于EditorTest.dll程序集
报错的意思是“包含多个程序集定义文件”
- 引用其他程序集,程序集中的Assembly Definition References
在这里引用这些程序集后,程序集所属的脚本就可以使用这些程序集里的Public类或者方法了,但是不能使用internal的类或者方法,并且要注意,程序集之间不能通过这个形成循环引用,勾选GUIDs的意思是对于程序集定义引用,使用GUID而非程序集名称。这样一来,被引用的程序集可以重命名,而无需更新引用。 ,即这些被引用的程序集可以重命名,但因为使用的是他们的GUID,所以重命名不影响引用
- Override References
这里的意思是,当不勾选Override References时,当前自定义程序集会引用所有的预编译程序集,勾选后,只会引用指定的预编译程序集,和Assembly Definition References 的区别在于这里指定的是对预编译程序集的引用
此时Main程序集没有勾选Override References,Unity.VisualScripting可以正确引用
当勾选,没有指定时
引用报错
当勾选后,在列表中引用相关程序集
报错消失了
- Auto Referenced
指定预定义的程序集是否应引用此项目程序集,即类似Assembly-CSharp.dll这样的预编译程序集是否会引用当前这个自定义程序集,默认勾选的话,预编译程序集是会自动引用当前自定义程序集的
在使用HybridCLR时,有一个注意项是不要将热更程序集的Auto Referenced选项否选,否则会出现打包失败的情况
- Define Constraints 有条件地包含一个程序集
即需要同时满足所有的符号表示的条件,这个程序集才会被编译,然后这里的符号可以是Project Setting中的Scripting Define Symbols定义的符号
可以是Unity定义的符号,比如UNITY_EDITOR之类的
还有 Version Defines 定义的符号
- Version Defines 版本定义
比如,我想要区分这个程序集中的代码在不同yooasset版本的时候的处理,那么可以这样
然后就可以在代码中引用这个符号,表示当yooasset的版本 >= 1.5.0时的处理
当前工程中的yooasset版本是2.3.x的版本,运行
走到了YOOASSET_NEW中
现在去掉这个定义
走到了#else中
那么,它和Project Setting中的Scripting Define Symbols有什么区别呢?
简单来说,就是Scripting Define Symbols定义的符号会影响到项目中所有的程序集,但是Version Defines 中定义的符号只会影响到当前定义的这个程序集
还有注意,如果Expression这里的版本范围表达式不填的话,经过实测,这个符号会一直生效
比如
- 设置程序集Internal成员的暴露
即当前程序集的Internal成员会暴露给这里面自定义名称的程序集,比如UniTask.Linq,UniTask.Addressables程序集现在可以使用这个脚本所在程序集的Internal成员
比如
新建一个Test程序集合Test脚本
此时InternalsVisibleTo脚本属于Main程序集
BuildTest属于Main程序集
这里的意思就是Main程序集的Internal成员会暴露给Test程序集
可以看到此时Test脚本能够顺利调用到BuildTest脚本的Internal的成员PrintTest