Unity 的背景
Unity引擎是一個(gè)跨平臺(tái)的游戲引擎野揪,最早發(fā)布于Apple的WWDC2005游昼。開發(fā)的主要語言是C#仪缸,這歸功于Mono,一個(gè).Net Framework的非官方實(shí)現(xiàn)(Xamarin公司開發(fā)并使用這個(gè)框架實(shí)現(xiàn)了用C#來開發(fā)跨平臺(tái)的應(yīng)用痴荐,后來被微軟收購血柳。)。有了Mono蹬昌,就解決了C#跨平臺(tái)的問題混驰。(為什么選擇C#而不選擇Java,可能是條款的問題皂贩,也可能是當(dāng)時(shí)的環(huán)境栖榨。)一個(gè)游戲引擎,為了實(shí)現(xiàn)跨平臺(tái)明刷,不僅僅是一個(gè)編程語言統(tǒng)一了就足矣婴栽。如果說計(jì)算機(jī)的計(jì)算速度快的不行,或者人們對(duì)游戲的需求只是局限于玩玩2D游戲辈末,那么的確可以這樣愚争,在Flash游戲(Action Script 3.0)最火的時(shí)候映皆,就是這樣的情況。但是現(xiàn)實(shí)的情況是轰枝,計(jì)算機(jī)的實(shí)際處理速度不夠快捅彻,臺(tái)式機(jī)的性能雖然很好了,現(xiàn)在移動(dòng)設(shè)備更受歡迎鞍陨。同時(shí)步淹,3D游戲似乎更炫酷,更能讓人沉浸其中诚撵。對(duì)于不需要事先跨平臺(tái)的游戲引擎來說缭裆,解決問題的方案還簡單一點(diǎn),CPU先天是并發(fā)效率比較弱寿烟,所以就用GPU來做輔助的圖形計(jì)算澈驼。GPU在上世紀(jì)九十年代還是不可編程只能配置,所以現(xiàn)在還是習(xí)慣稱之為硬件加速器筛武。隨著時(shí)代發(fā)展缝其,GPU也能夠編程了,但是還是有很多限制畅铭,還沒辦法像CPU上的語言那樣氏淑,發(fā)展出Java/C#等與硬件無關(guān)的解決方案〔現(xiàn)在的GPU編程語言還是比較貼近硬件的硕噩,雖然有了一些高級(jí)的語言Cg、GLSL缭贡、HLSL(統(tǒng)稱之為Shader語言炉擅,編譯出來的程序稱之為Shader Program,簡稱Shader阳惹,Shader受限于Shader Model谍失,在渲染流水線上,相應(yīng)的位置有相應(yīng)的Shader)莹汤,但這些高級(jí)語言還是比較貼近硬件快鱼,類似于C/C++,在不同的GPU硬件上都需要(重新)編譯一次纲岭。Shader語言編譯的工作不需要游戲引擎實(shí)現(xiàn)抹竹,而是由GPU的生產(chǎn)商來實(shí)現(xiàn)。而生產(chǎn)商又會(huì)遵循主流的標(biāo)準(zhǔn)止潮,例如做一個(gè)HLSL的版本給DirectX窃判,做一個(gè)GLSL的版本給OpenGL等等。像主機(jī)的開發(fā)商任天堂喇闸、Sony袄琳,有他們自己的硬件询件,他們自研的引擎一般不需要考慮跨平臺(tái)了。Unity要開發(fā)一個(gè)跨平臺(tái)的游戲引擎唆樊,當(dāng)然就需要考慮怎么解決Shader的跨平臺(tái)了(CPU端的問題宛琅,mono已經(jīng)替他們解決了)。目前的情況逗旁,沒有一種GPU的API是真正的跨平臺(tái)夯秃。像DirectX,毫無疑問痢艺,只能在Windows上用仓洼,Windows雖然在PC端有占大多數(shù)的份額,但在移動(dòng)端的市場幾乎為0堤舒,而現(xiàn)在移動(dòng)端的用量比PC還要多色建。OpenGL在PC上能用,在Mac上也能用舌缤。在移動(dòng)端占主流的那個(gè)箕戳,雖然叫OpenGL ES,并且Shader語言也是GLSL国撵,但是同樣名字的語言陵吸,其實(shí)也是有很多版本的。現(xiàn)在真正實(shí)現(xiàn)跨平臺(tái)最多的介牙,可能就是OpenGL ES了壮虫,PC上的WebGL就是OpenGL ES。如果用OpenGL ES环础,Unity會(huì)比較被動(dòng)的囚似,因?yàn)镋S不能發(fā)揮出硬件的所有性能。Unity的解決方案是Shader Lab线得,這個(gè)語言是類似HLSL饶唤,或者Cg的。Shader Lab的實(shí)現(xiàn)方案是贯钩,將這個(gè)語言編譯到目標(biāo)平臺(tái)能夠使用的語言募狂,例如某個(gè)版本的GLSL。雖然Unity號(hào)稱是跨平臺(tái)的角雷,但是并沒有達(dá)到運(yùn)行時(shí)跨平臺(tái)祸穷,而只能做到編譯時(shí)的跨平臺(tái)。如何實(shí)現(xiàn)運(yùn)行時(shí)跨平臺(tái)谓罗?就是開發(fā)出一個(gè)Unity Player粱哼,系統(tǒng)平臺(tái)裝了這個(gè)Player后,就能運(yùn)行開發(fā)者開發(fā)出來的游戲文件檩咱。曾經(jīng)Flash完成了一半這項(xiàng)工作揭措,但后來移動(dòng)端的興起胯舷,GPU在游戲中的重要性與日俱增,又毀掉了Flash的前程“砗現(xiàn)在最接近這個(gè)任務(wù)的是Unity了桑嘶。得益于移動(dòng)端的發(fā)展,但Unity的今天躬充,已經(jīng)不再是他的跨平臺(tái)的feature了逃顶,而是一套成熟的工具鏈,這個(gè)工具鏈還實(shí)現(xiàn)了一個(gè)生態(tài)充甚,Asset Store以政。
Hello Unity
Unity游戲的開發(fā),依賴于Unity開發(fā)工具伴找。很多游戲引擎盈蛮,只是作為一個(gè)庫的存在,基于這些引擎的開發(fā)技矮,更像是一項(xiàng)編程的工作——打開一個(gè)text editor抖誉,便可開始敲代碼,一運(yùn)行衰倦,就能看到自己的編程成果袒炉。游戲的開發(fā),有不少的工作量是界面上的布局樊零,這樣的工作我磁,非常需要有一個(gè)GUI編輯器來實(shí)現(xiàn)。Unity實(shí)現(xiàn)了這樣的功能淹接,稱之為Scene十性。Scene本身其實(shí)也是游戲引擎的一個(gè)運(yùn)行的結(jié)果叛溢,當(dāng)然塑悼,在PC上,Scene是基于PC的楷掉,而PC開發(fā)的游戲厢蒜,不一定發(fā)布到PC平臺(tái),因此效果并不能劃等號(hào)烹植。Scene支持鏡頭的拖動(dòng)斑鸦,或者選擇toolbar上的其他選擇,可以實(shí)現(xiàn)對(duì)Scene中的對(duì)象進(jìn)行編輯草雕。Scene中的對(duì)象是什么巷屿?是可渲染的對(duì)象。搭配著Scene一起使用的還有Hierarchy墩虹,Hierarchy列表是由GameObject對(duì)象組成的嘱巾,Scene的渲染是基于Hierarchy中的GameObject憨琳,但是GameObject不一定是可渲染對(duì)象,GameObject本身可以認(rèn)為是一個(gè)容器旬昭,可以添加各種Component篙螟,而Scene中可見的對(duì)象來自帶有Renderer Component的Game Object對(duì)象。雖然有點(diǎn)繞问拘,但是這里強(qiáng)調(diào)一點(diǎn)遍略,Scene中的對(duì)象并不能與Game Object劃等號(hào),它只是Game Object的一部分骤坐,它是一個(gè)具有Renderer + Mesh Filter的GameObject的呈現(xiàn)绪杏。那些不具備這些特性的Game Object,不會(huì)在Scene中出現(xiàn)纽绍,但是是Hierarchy的一部分寞忿。Scene和Game(窗口)的區(qū)別,是Game的Camera在Hierarchy中配置顶岸,而Scene的Camera是不在Hierarchy中的腔彰,Scene本身也可以認(rèn)為是一個(gè)具有交互性質(zhì)的已發(fā)布的Game,其Camera就是編輯器的渲染視角辖佣。
那種在text editor上編輯并啟動(dòng)的游戲霹抛,可以認(rèn)為是code driven的,需要用戶自己創(chuàng)建一個(gè)scene卷谈,然后要么代碼式的生成出場景效果杯拐。而Unity則是scene driven的,不需要用戶在代碼中創(chuàng)建scene世蔗,而是由引擎的runtime自動(dòng)創(chuàng)建scene端逼。用戶可以在Build Setting界面,將添加需要的scene污淋,而列表中第一個(gè)scene便是Unity runtime在啟動(dòng)時(shí)會(huì)去加載的scene顶滩。這個(gè)scene可以認(rèn)為是Scene對(duì)象的一個(gè)序列化文件。用戶在Scene上編輯的后寸爆,按保存礁鲁,就可以認(rèn)為是序列化的過程。啟動(dòng)時(shí)加載scene赁豆,則是反序列化的過程仅醇。
作為程序員,Unity最簡單的Hello World魔种,不是創(chuàng)建一個(gè)Text對(duì)象析二,而是創(chuàng)建一個(gè)空的Game Object,給這個(gè)Game Object添加一個(gè)Component节预,這個(gè)Component是一個(gè)可編程的組件叶摄,而不是可編輯的組件(其他的Component)漆改,這個(gè)Component可命名為HelloWorld(.cs),然后在代碼編輯器中准谚,刪除掉Class中兩個(gè)Override方法挫剑,而是Override Awake方法。在方法中寫上“Debug.Log("Hello World");”柱衔。這便是最簡單的Hello Unity了樊破。