學習筆記 - Unity是如何將你的項目發佈到如此多的平臺的?

    不少Unity的開發者是否是都會以爲Unity能把項目導出發佈到那麼多不一樣的平臺上運行是件很牛X的事情?那麼你有沒有想過Unity是如何作到的呢?本文就來大致的聊一聊Unity作的這件神奇的事情。web

 

概覽

    首先來看下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。app

 

物理

     在物理方面。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的技術人員就須要把代碼兼容到全部平臺上。spa

 

腳本

     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的運行機制時是這樣說的:3d

既然Unity發佈的項目會搭載Mono運行環境,那是否是整個.NET框架都會被包含進去呢?其實並非,沒有使用的類在連接時會被剔除,因此只有你用到的類會被打包到你的項目中。ps: Unity已經開始用IL2CPP技術,詳情可見:http://blogs.unity3d.com/2014/05/20/the-future-of-scripting-in-unity/

 

     以上就是和你們分享的內容,但願對你有所幫助。Happy Coding, Happy Life!

相關文章
相關標籤/搜索