Unity引擎組成

學習筆記 - 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章