Unity引擎組成
很多Unity的開發者是不是都會覺得Unity能把專案匯出釋出到那麼多不同的平臺上執行是件很牛X的事情?那麼你有沒有想過Unity是如何做到的呢?本文就來大體的聊一聊Unity做的這件神奇的事情。
概覽
首先來看下Unity支援的平臺列表:
依次是iOS, Android, Windows Phone, Tizen, Windows, Windows Store Apps, Mac, Linux/Steam OS, WebGL, PlayStation4, PlayStation Vita, Xbox One, Xbox 360, WiiU, Nintendo 3DS, Oculus Rift, Google Cardboard, Steam VR, PlayStation VR, Gear VR, Microsoft Hololens, Android TV, Samsung SMART TV, tvOS.
實在是太多了。那麼Unity的技術人員是不是真的一個個平臺去適配呢?答案是否定的,儘管Unity的技術人員為跨平臺做了大量的工作,但是Unity仍舊需要依賴幾家合作公司來幫助他們在不同的平臺上實現一些功能。每當有一個新的平臺釋出時,Unity的技術人員首先就會檢測Unity的每一個功能,看看是不是有功能已經被他的合作方在新平臺上實現了,如果有的話,那麼Unity對該新平臺的支援所花費的時間就會大大減少。現在來看看Unity的一些主要功能:
圖形
Unity支援的圖形API有:OpenGL, OpenGL ES, WebGL, Metal和DirectX,每個API都針對不同的平臺。OpenGL被使用的最為廣泛,從MacOS X到iOS裝置、再到Linux甚至Windows平臺,都可以使用OpenGL。OpenGL ES是與移動裝置相容的圖形API,應用在絕大部分Android裝置和一些iOS裝置上。WebGL是應用在基於瀏覽器的遊戲和應用上的,有了WebGL,就不再需要在瀏覽器上安裝如Flash和Unity web player這樣的外掛了。Metal是蘋果公司新的圖形API,與絕大部分最近發售的iOS裝置相容。最後,DirectX是微軟公司的圖形API,可以在Windows, Windows Phone和Xbox上使用。所以,儘管Unity的技術人員花費了大量時間在圖形功能上,但其實絕大部分時間都是在將這些圖形API整合到Unity中,而不是從頭開始寫Unity自己的圖形API。
物理
在物理方面。Unity只使用一個工具,那就是Nvidia的PhysX,它支援Unity釋出的所有平臺。Unity在所有平臺上都使用同一個物理引擎的原因是為了保證所有的碰撞、移動以及其他物理效果在各個平臺上都保持一致。
光照
在光照烘焙以及實時光照方面,Unity同樣依賴第三方工具。在Unity5.x版本之前,使用Autodesk的Beast來烘焙光照效果,從Unity5.x版本開始,使用Geomeric的Enlighten工具來烘焙光照以及計算實時GI。
網路
2014年,Unity釋出了Unity Networking,這是Unity自己研發的網路和多人線上解決方案。Unity Networking由兩部分組成:網路API(包括高階API與底層API),以及付費的多人線上服務。由於這是Unity自己的內部專案,因此Unity的技術人員就需要把程式碼相容到所有平臺上。
指令碼
Unity支援使用C#和UnityScript來編寫指令碼程式碼,那麼它是如何讓指令碼程式碼在不同平臺上執行的呢?答案就是幕後的功臣:Mono。什麼是Mono呢?Mono是一個跨平臺的、開源的.NET開發框架。我們來看看Mono的歷史。微軟在2000年釋出了.NET框架,稱其為“基於網際網路標準的新的平臺”。來自Xamarin公司的Miguel de Icaza非常熱愛.NET,他想用.NET在Linux下進行開發,可惜的是.NET並不支援除Windows以外的平臺,於是他就決定自己開發一個環境,然後在2001年,Mono開源專案成立了。所以本質上來說,Mono是一個為了將.NET框架應用在其他平臺上的開源專案,它有自己的C#編譯器和CLR(Common Language Runtime)。今天來看Mono,它不單已經實現了絕大部分.NET工具,而且還有一些擴充套件工具。總結一下,Mono是一個開源的、用C/C++實現.NET開發框架,使得.NET可以在其他平臺使用的專案。Mono完整支援的系統和架構可參考:http://www.mono-project.com/docs/about-mono/supported-platforms/
現在回到Unity上,我們已經知道Unity支援使用C#和UnityScript來編寫指令碼程式碼,假設我們使用C#來編寫指令碼程式碼,那麼在使用Java的Android平臺或使用object-C的iOS平臺上Unity是如何執行我們的專案的呢?Unity難道會把程式碼編譯成每個平臺使用的原生程式碼嘛?答案是否定的,Unity才不會那麼蠢,把程式碼編譯成每個平臺使用的原生程式碼。那麼在使用Java的Android平臺如何執行我們的專案呢?你可能還不知道,你可以在Android上使用C/C++來進行開發,但我們不會這麼做,因為Java要方便的多,但是Mono會這麼做。是的,Mono負責在各個平臺上執行我們的專案。但是你可能想問,我沒有在執行裝置上安裝過Mono啊?!沒錯,因為每個用Unity釋出的專案(以及每個用Mono開發的專案)都搭載了Mono執行環境,Xamarin在解釋Mono的執行機制時是這樣說的:
既然Unity釋出的專案會搭載Mono執行環境,那是不是整個.NET框架都會被包含進去呢?其實並不是,沒有使用的類在連結時會被剔除,所以只有你用到的類會被打包到你的專案中。ps: Unity已經開始用IL2CPP技術,詳情可見:http://blogs.unity3d.com/2014/05/20/the-future-of-scripting-in-unity/
原文連結:https://www.cnblogs.com/twjcnblog/p/5592059.html