首先需要了解的是,Unity3D的C#基礎腳本子產品是通過Mono來實作的。
什麼是Mono?
參考下百度百科:Mono是一個由Novell公司(由Xamarin發起)主持的項目,并由Miguel de lcaza上司的,一個緻力于開創.NET在Linux上使用的開源工程。它包含了一個C#語言的編譯器,一個CLR的Runtime,和一組類庫,并實作了 ADO NET和ASP NET。
它基于CIL和C#的ECMA标準,提供了了微軟.Net FrameWork的另一種實作。
Mono主要有以下部分組成:
C#編譯器——mcs。(最新的Mono版本已經可以支援C#5.0,但Unity3D的Mono版本仍然停留在2.0+階段(支援c#3.0),是以C#的一些新功能無法在unity中使用)
運作時:即時編譯器JIT(後文會介紹)。以及GC,類庫加載器等等。
基礎類庫(BCL)。
Mono類庫。提供了超出微軟.NET的一些類,提供了許多額外功能,主要是用于建構其他作業系統上的應用。
下面進入正題:
Mono和Unity
Unity引擎本身是由C++寫出的,隻不過Mono被嵌入到了Unity當中,為unity提供了一個完整的虛拟機運作環境。這樣Mono的嵌入接口會将Mono Runtime暴露給Unity底層的C++代碼。通過這些接口,開發者就可以控制Mono Runtime,以及依托于Mono Runtime的托管代碼。
Unity為何能夠跨平台?
一句話概括,主要原因在于Unity通過Mono使用了一種叫CIL(Common Intermediate Language,也叫MSIL)通用中間語言的基于堆棧的代碼指令集,它屬于CLR的一個子集。
Unity3D的開發過程中,代碼的編譯主要分為兩個過程:
1)首先将對應的腳本代碼編譯成CIL(之後CIL還會被編譯成一種位元碼,生成一個CLI集合)。
2)然後Mono在運作時将CLI集合中的位元碼編譯為本地運作的原生指令。(這裡會使用到上文中的JIT、AOT編譯模式)
注:也就是說在Mono中運作的其實是CIL,而在本地運作的是被編譯後生成的原生指令。
更多unity2018的功能介紹請到paws3d學習中心查找。