Unity3d-跨平台(二)
轉自:http://www.jiandaima.com/blog/archives/945.html
是如何輸出到多平臺的?
我的第一篇文章,選擇了一個不那么簡單的主題,但是是我近期比較感興趣的。這周,我和一個朋友,談到了游戲開發和Unity3D,他問我,“為什么Unity可以輸出到那么多的平臺上?”我想了一下,試圖組織語言,但是我盡然不能回答這個問題。我從來沒有認真想過這個問題,所以,我開始做一些研究。
哪些人適合看這篇文章:如果你是一個開發者,對于 托管、本地代碼,執行環境和不同平臺這些概念有一定的了解,這篇文章是為你準備的。如果你是3D、2D美術,或者對于這類工作比較好奇的人,我非常抱歉,你可以停下來了,并接受一個可怕的答案:它就是這樣神奇。你可以跳到本文的最后兩段,結論在那里。如果你還是很好奇,你可以試一試繼續讀下去。
我們開始討論這篇文章的話題:Unity3D可以說是市面上最流行的游戲開發引擎了。它非常友好(相信我,學習一些教程之后,15歲的孩子也能使用它)。它現在有Window和MacOs X版(Linux現在還在實驗階段),本文最重要的一點:它可以輸出在幾乎所有的設備上。我不是在開玩笑,看一下官網上的列表:
iOS
Windows Phone
BlackBerry
Windows
Windows Store Apps
Mac OS X
Linux
Their native Web Player
PS 3
Xbox 360
Wii U
PS 4
Xbox One
Tizen
SamsungTV
PS Vita
Gear VR
Oculus Rift
它適合無數的設備和環境。如果你還不知道Unity3D,可以試一下。免費的版本可輸出Mac OX, Linux, Window, iOS, Android, BlackBerry, Web Player,SamsungTV, WebGL, Tizen,WindowPhone。相當不錯,試一下。(遺憾,我并沒有收收到Unity官方的廣告費,僅僅只是我覺得它真是太贊了。)
更新:Jashan在評論里指出,這篇文章,我只把重點放在了腳本上,所以,我決定多寫一點關于Unity3D如何輸出其他特性到如此多的平臺上。閱讀下面一段,你會注意到,盡管使用Unity技術是一個偉大的工作,它依然依賴于許多公司幫助它將一些特性引入Unity。在新平臺中發布時,Unity的開發人員會一個一個地檢查量否支持每個特性,如果是的話,完成這些特性的時間會大幅度降低。現在,讓我們看一下這些主要要特性。
圖形
我們從圖形開始。Unity提供大量的圖形API:OPenGL, OpenGL ES,WebGL,Metal和DirectX,每一套API都有一個目標平臺。OpenGl用得最廣,它可以運行在MacOS X,iOS,Linux還有Windows上。OpenGL ES適合一些移動設備,Andriod和iOS最為常見。WebGL是基于瀏覽器的圖形應用和游戲的希望,它可以淘汰掉Flash插件和Unity的Web Player。Metal是蘋果上新的圖形API,它可以兼容最近的iOS設備和一些Californian公司的電腦。最后,DirectX,是微軟自己的的圖形API,兼容Windows, Windows Phone、XBOX。所以,UT的開發者花了大量的時間在圖形上,但大部是用于將這些工具整合進引擎中,而不是從頭開始寫自己的API。
物理引擎
輪到物理引擎了,Unity信賴一個工具:Nvidia的PhysX,Unity發布的每一個平臺,它都可以支持。毫無疑問,它是市面上最好的物理引擎,從每一版的游戲引擎開始,它就是值得信任和高效的,那時PhysX還被叫做Novodex,也沒有被Nvidia收購。不同平臺使用同一物理解決方案的主要原因是它的一致性:在不同的設備上,所有的碰撞、運行都必須有相同的行為,否則,某些平臺就會更受歡迎。
燈光
更說一次,Unity依賴于終端工具實現燈光,不論是烘焙出來的燈光還是實時燈光。在以前,進行烘焙燈光用Autodesk的Beast,現在它被 Enlighten取代。在新的5.X版本中,它可以同時實現時實全局光照和烘焙燈光。
網絡層
2014年,Unity內部發布了UNET(Unity的網絡層),是Unity自主研發的多玩家的網絡方案。過去,一些網絡解決方案開始普及,最有名的就是Photon。新的工具包括兩個方面,網絡層的API(有API高低級別)和有償的多人服務,不同于上面描述的圖形、物理引擎和燈光,由于這是一個內部項目,UT必須移值代碼到所有支持的平臺上去。
最后:腳本
給那些還不了解Unity的人,Unity讓我們使用C#和UnityScript腳本(EWW),不需要任何轉換或是專門的工具,將我們的游戲輸出到前面列出的平臺上。好像很簡單。引出了一個問題:如何做到的?我以為只要我停下來,想一想就可以得到答案,但即使我有一些Unity工作原理的認識破,我也不能回答為什么。所以,我問了這些年我最好的朋友(google)如本文標題的這個問題。這樣說吧,我沒有得到最好的反饋,后來,我找到了原因:我問了錯誤的問題。
本文中真實的明星是:Mono。我知道Mono對于Unity是很重要,但它遠遠超過了我所想。讓我們從這里開始:Mono究竟是什么?根據官網:Mono是跨平臺,開源的.net開發框架。還是有一些疑惑,讓我們深入Mono的歷史。
2000年微軟發布了“基于inernet標準的新的平臺”.Net的框架,Xamarin公司有一個叫Miguel de Icaza的人非常喜歡.NET,想開發Linux的版本,微軟的.net不支持Linux(到現在還是不支持)和一些其他的非窗口平臺。他干脆決定創建他自己的環境,Mono工程在2001開源。Mono由一個開源項目,把net框架被帶入了其他平臺,包括C#編譯器和CLR(公同語言運行庫)。從歷史來看,Mono一開始就被放在了.net之后。今天它不僅實在了.net的功能,還有一些外的功能。總結一下,Mono是一個開源項目,用C/C++實現了.Net的開發框架,今天可以運行在一大堆平臺上。
現在,我們停止討論Mono,轉到Unity上來。在Unity中,我們是如何用腳本編程?用C#或是UnityScript,這里又引出一個問題,如果我們用C#編程,為什么Unity游戲可以運行在如此多的平臺上?難道在上不需要JAVA,在iOs上不需要用Object-C來代替C#?難道Unity編不同平臺的游戲時不需要平臺本地代碼?如此多的問題。
我們從最后一個問題開始。不需要,Unity編不同平臺的游戲不需要本地代碼。聽上去太瘋狂了。Android不用JAVA?不用。你也可以用本地代碼開發(用C/C++),但是沒有人想那樣做,對嗎?那就是Mono做的事情。
現在我們說一說最重要的問題:沒有C#的運行環境,為什么我的Android設備可以運行一個C#寫的游戲?Mono運行了它。但是,我并沒有在我的設備上安裝Mono呢?所以,基本問題是:Mono是如何進入我的設備的?Unity編譯的游戲(和用Mono開發的應用)運行了一個Mono環境。你瘋了沒有?我現在不能證明它,但是Xamarin在這里“How it works”聲明過,非常有道理:
使用C#寫你的APP,從C#中直接調用平臺的API。Xamarin編輯器捆綁了.NET運行庫,輸出成一個ARM可執行文件,再打包進iOS和應用中。
這又產生了另一個問題:一個MONO發開APP附帶了整個框架?答案可以在同一網頁中找到:編輯Link的時候,在框架中沒有使用的類會被剝離出來。所以,只是部分框架被綁定在你的APP中,如果你想了解更多的它是如何工作,訪問網頁 Developer Center。
所以,Mono是這里的上帝,它為Unity游戲提供了.Net框架。這是為什么,你使用C#編出來的游戲,能在如此多的平臺上運行的原因。這是我的第一貼,我希望我能有更多的想法來更新博客。不論你喜歡或者不喜歡,或者某個地方有錯,甚至你覺得這篇文章完全是胡扯,都可以請留言。
重要更新(2015年9月):IL2CPP技術改變了腳本后臺工作的方式,淘汰了Mono的VM和AOT編輯器。
下面讀什么?我寫了一個新貼子,關于Unity3D在引擎之下是如何工作的,我們的代碼是如何與引擎代碼相交互的。
總結
以上是生活随笔為你收集整理的Unity3d-跨平台(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QPSQL driver not loa
- 下一篇: c++堆栈中 top() pop()的具