對于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