一瞥Unity集成開發環境(jing)中的(de)軟件工程設計思想
時(shi)間:2018-09-27 來(lai)源:未知
概述: 本文(wen)對Unity集成(cheng)開(kai)發環境主要部(bu)分進行了軟件(jian)工程(cheng)技術(shu)上的拆解,嘗試從交(jiao)互(hu)式的編程(cheng)技術(shu)、正向與反向工程(cheng)、設(she)計(ji)模式、組件(jian)模型(xing)設(she)計(ji)、 面向對象的設(she)計(ji)和軟件(jian)可擴展性(xing)等幾個方面進行了論述,為(wei)想(xiang)深入了解Unity開(kai)發世界(jie)的技術(shu)人(ren)員奠定(ding)基礎。
1 背景
Unity是一(yi)(yi)個強(qiang)大的(de)(de)(de)(de)集成(cheng)游戲引擎和(he)編輯(ji)器,可(ke)(ke)以(yi)(yi)讓開發者可(ke)(ke)以(yi)(yi)迅速高(gao)效地創建對象、導入外部資源,并且用代碼把它們連接(jie)在一(yi)(yi)起(qi)。Unity編輯(ji)器是 可(ke)(ke)視化的(de)(de)(de)(de),其圍(wei)繞(rao)這樣(yang)的(de)(de)(de)(de)原則而(er)構建,即開發者可(ke)(ke)以(yi)(yi)使用一(yi)(yi)個簡(jian)單的(de)(de)(de)(de)拖放動作來(lai)完成(cheng)任(ren)何任(ren)務,甚至(zhi)可(ke)(ke)以(yi)(yi)連接(jie)腳本,自己(ji)編寫程序實現特(te)定的(de)(de)(de)(de)功(gong)能。
鑒于Unity 3D的集成(cheng)開發(fa)環境(jing)的安裝和搭建(jian)已經有(you)了(le)論(lun)述,我們(men)試圖對Unity集成(cheng)環境(jing)進(jin)行(xing)簡要的技(ji)(ji)術(shu)解析(xi)(xi)。下(xia)面會首先介紹Unity總體集成(cheng) 開發(fa)環境(jing)的主界面布局,而后(hou)對Unity的軟(ruan)件工具設計思想進(jin)行(xing)軟(ruan)件技(ji)(ji)術(shu)上的分析(xi)(xi)。
2 總(zong)體開發環境概(gai)覽
正如Visual Studio為微軟公司的(de)(de)Windows平臺提(ti)供(gong)高效的(de)(de)開(kai)發(fa)環境一樣,Unity的(de)(de)集成開(kai)發(fa)環境為虛擬現實(shi)(AR/VR/MR)平臺的(de)(de)開(kai)發(fa)提(ti)供(gong)了有(you)力的(de)(de)生產 力工(gong)具。下面(mian)對開(kai)發(fa)界面(mian)布局中涉及的(de)(de)主要子窗口略(lve)要說明(ming)。
• Scene【場(chang)景(jing)面板】:該面板為Unity3D的(de)編輯面板;你可(ke)以將你所(suo)有的(de)模型、燈光、 以及其他材質對象拖放到該場(chang)景(jing)中。構建游(you)戲中所(suo)能(neng)呈(cheng)現景(jing)象。
• Game【游戲面(mian)(mian)板(ban)】:與場景面(mian)(mian)板(ban)不同,該面(mian)(mian)板(ban)是用來渲(xuan)染場景面(mian)(mian)板(ban)中景象的(de)。該面(mian)(mian) 板(ban)不能用作(zuo)編輯,但卻(que)可以呈現(xian)完(wan)整的(de)動畫效果。
• Hierarchy【層次(ci)清單(dan)欄】:該面板(ban)欄主要功(gong)能(neng)是顯(xian)示放在(zai)場景面板(ban)中(zhong)所有(you)的物(wu)體對 象。
• Project【項(xiang)目文(wen)件欄】:該(gai)面板欄主(zhu)要功能是顯示該(gai)項(xiang)目文(wen)件中的(de)所有資(zi)源(yuan)列表。 除(chu)了模型(xing)、材質、字(zi)體等,還包括該(gai)項(xiang)目的(de)各(ge)個場景文(wen)件。
• Inspector【監視(shi)面(mian)板(ban)】:該面(mian)板(ban)欄(lan)會呈現出(chu)任何對(dui)象(xiang)的(de)所固有的(de)屬性,包括三(san)維坐 標、旋轉量(liang)、縮放(fang)大小、腳本(ben)的(de)變量(liang)和對(dui)象(xiang)等等。
• 【場(chang)景調整(zheng)工具】:可(ke)改變(bian)你(ni)在(zai)編(bian)輯過(guo)程中(zhong)的(de)(de)場(chang)景視角(jiao)、物體世界坐(zuo)標和本地坐(zuo)標 的(de)(de)更換、物體法線中(zhong)心的(de)(de)位子,以及物體在(zai)場(chang)景中(zhong)的(de)(de)坐(zuo)標位置,縮放(fang)大小等(deng)等(deng)。
• 【播放、暫停、逐幀按鈕】:用(yong)于運(yun)行游戲(xi),暫停游戲(xi)和逐幀調試(shi)程序。
• 【層級顯示按鈕(niu)】:勾選或取(qu)消該下拉框(kuang)中對應(ying)層的名字,就能決定該層中所有物 體是否在場景面板(ban)中被顯示。
• 【版面(mian)布(bu)局按鈕】:調(diao)整該下拉框中的(de)選(xuan)項(xiang),即(ji)可改(gai)變編輯面(mian)板的(de)布(bu)局。
• 【菜單(dan)欄】:和其他軟件一(yi)樣,包含了軟件幾(ji)乎所有(you)要用到的工具下拉菜單(dan)。

圖 1 Unity中文集成(cheng)開(kai)發環(huan)境

圖 2 Unity英(ying)文(wen)集成開(kai)發環(huan)境
由于(yu)中英文表達(da)習慣的不同,不同的技術(shu)人員對術(shu)語的中文表達(da)存(cun)在差(cha)異性,下(xia)面為了(le)讀者更好地理(li)解,特此(ci)總結表格如下(xia):

3 交互(hu)式編程技術
3.1 引言
計算機科學(xue)領域,交互式編程技(ji)術很早就有了(le)實現版(ban)本(ben),比(bi)如Tcl/Tk語言應用在美國很多(duo)高校(xiao)的實驗室(shi)和研(yan)究所,用來快速展現原型設計。鑒(jian)于很多(duo) 工程師剛(gang)走(zou)出(chu)校(xiao)門,很多(duo)從編譯(yi)型語言收益,尤其是(shi)c/c++,因此容易養成了(le)“慣性”。隨(sui)著現代編程語言的大量涌現,比(bi)如python語言,特別是(shi)網絡 經濟所催生(sheng)的“短-平-快”模(mo)式,使得交互式的編程語言技(ji)術更加契合技(ji)術人員的生(sheng)活。比(bi)如:
Python語言
Python的(de)(de)設計哲(zhe)學是“優雅”、“明確”、“簡單”,是一(yi)門完全面向對象的(de)(de)語(yu)(yu)言(yan)。IDLE是Python軟件包(bao)自帶的(de)(de)一(yi)個(ge)集成開發環境,初學者(zhe)可以利(li)用(yong)(yong) 它方便地創建、運(yun)行、測試(shi)(shi)和調(diao)試(shi)(shi)Python程序(xu)。IDLE帶有(you)一(yi)個(ge)編(bian)輯(ji)器,用(yong)(yong)來編(bian)輯(ji)Python程序(xu)(或者(zhe)腳本);有(you)一(yi)個(ge)交互式解釋(shi)器用(yong)(yong)來解釋(shi)執行Python 語(yu)(yu)句;有(you)一(yi)個(ge)調(diao)試(shi)(shi)器來調(diao)試(shi)(shi)Python腳本。正式由于交互的(de)(de)解釋(shi)器為該編(bian)程語(yu)(yu)言(yan)提供了便利(li)。
Ruby語言
Ruby是(shi)(shi)一門開源的(de)(de)(de)動(dong)態編程(cheng)語言,注重簡潔和(he)效率。因此Ruby 的(de)(de)(de)句(ju)法優雅,讀起(qi)來(lai)(lai)自然,寫起(qi)來(lai)(lai)舒(shu)適。它(ta)也是(shi)(shi)一種簡單快捷的(de)(de)(de)面向對(dui)象(xiang)(xiang)(面向對(dui)象(xiang)(xiang)程(cheng) 序設(she)計(ji))腳本語言,它(ta)的(de)(de)(de)靈感與特性來(lai)(lai)自于 Perl、Smalltalk、Eiffel、Ada以(yi)及 Lisp 語言。Ruby的(de)(de)(de)交互(hu)性可以(yi)通(tong)過(guo)“irb”展現。irb是(shi)(shi)一個(ge)交互(hu)式 的(de)(de)(de)Ruby界面(Ruby解(jie)釋器)。可以(yi)通(tong)過(guo)irb來(lai)(lai)調試、運行和(he)實驗Ruby代(dai)碼(ma)(ma)。這(zhe)意味著它(ta)不用處理文(wen)件,可以(yi)直(zhi)接在會話中輸入代(dai)碼(ma)(ma),測試Ruby代(dai)碼(ma)(ma),同 時也是(shi)(shi)一個(ge)學習Ruby的(de)(de)(de)好工(gong)具。
Powershell/Bash
Bash是(shi)Unix系(xi)統(tong)或(huo)類Unix系(xi)統(tong)支(zhi)持(chi)很(hen)久的(de)shell解(jie)釋(shi)(shi)器(qi),Powershell是(shi)微軟公司新型(xing)針對Windows平臺(tai)的(de)解(jie)釋(shi)(shi)器(qi),兩者都可以通過技術人員敲命令快(kuai)速 實現編程(cheng)(cheng)。正是(shi)由(you)于應用的(de)普遍性,使得很(hen)多技術人員忽略了它們本身就(jiu)是(shi)一門(men)很(hen)好的(de),有用的(de)和(he)(he)便捷(jie)的(de)交互式(shi)編程(cheng)(cheng)語言。但缺點(dian)就(jiu)是(shi)跟(gen)其(qi)它圖(tu)形化(hua) 的(de)解(jie)釋(shi)(shi)器(qi)相比,在可視化(hua)編程(cheng)(cheng)方便還仍顯得笨拙和(he)(he)低效。
總之,交(jiao)互式的(de)編程語言(yan)(很多(duo)是腳本語言(yan))都提(ti)供類似的(de)控(kong)制(zhi)臺(tai),直接輸入腳本語句,回車(che)就執行了,結果立(li)即顯示出來,無須經過復(fu)雜的(de)保(bao)存(cun)和 編譯階段。
3.2 Unity集成環(huan)境的場景面板
Unity 3D中,“場(chang)(chang)景(jing)(jing)(jing)”是(shi)一(yi)個(ge)視圖,我們通過“場(chang)(chang)景(jing)(jing)(jing)”這個(ge)視圖,來(lai)編(bian)輯、布置(zhi)游(you)戲(xi)(xi)中玩家所能見到的(de)圖像和(he)聲(sheng)音。場(chang)(chang)景(jing)(jing)(jing)包含游(you)戲(xi)(xi)的(de)對象(xiang)。它們可(ke)以 用來(lai)創建主菜單、個(ge)人級別(bie)(level)和(he)其他(ta)任(ren)何東(dong)西(xi)。認為每(mei)個(ge)獨特的(de)場(chang)(chang)景(jing)(jing)(jing)文件(jian)作(zuo)為一(yi)個(ge)獨特的(de)級別(bie)(level)。在(zai)每(mei)一(yi)個(ge)場(chang)(chang)景(jing)(jing)(jing)中,你(ni)將放置(zhi)你(ni)的(de)環 境,障礙和(he)裝(zhuang)飾,從(cong)而設計和(he)構(gou)建了(le)你(ni)的(de)游(you)戲(xi)(xi)。
在(zai)開發過(guo)程(cheng)中(zhong),我們能在(zai)“Scene”視(shi)圖中(zhong),就可以直接放(fang)入所有的游(you)戲對象(物(wu)體),從(cong)而共(gong)同(tong)形成一個(ge)場景,而且會在(zai)Hierarchy視(shi)圖中(zhong)通過(guo)層級 關系列出(chu)來。

圖 1 當前3個發展方向
透過(guo)上面的(de)分(fen)析,我們能夠看(kan)到Unity環境(jing)很好滴沿用(yong)(yong)了現代編程語言的(de)交互(hu)式開發模式和體驗(yan),只需用(yong)(yong)戶(hu)將需要的(de)物(wu)體放入場(chang)景(如(ru)圖中放入一個(ge)球 體),Hierarchy選(xuan)項卡就可以實(shi)時看(kan)到物(wu)體的(de)諸多屬性;反過(guo)來用(yong)(yong)戶(hu)修(xiu)改某個(ge)屬性信息又可以在(zai)場(chang)景環境(jing)中實(shi)時地看(kan)到變(bian)化(hua)。而且,在(zai)游戲(Game) 選(xuan)項卡中用(yong)(yong)戶(hu)能夠預覽到運行時的(de)場(chang)景變(bian)化(hua)。
4 正向工(gong)(gong)程(cheng)與反(fan)向工(gong)(gong)程(cheng)
4.1 引言
反向(xiang)(xiang)(xiang)工(gong)(gong)程(cheng)(cheng)(cheng)(cheng)也稱逆(ni)向(xiang)(xiang)(xiang)工(gong)(gong)程(cheng)(cheng)(cheng)(cheng)(英(ying)文(wen)是(shi)(shi)reverse engineering),是(shi)(shi)相對正向(xiang)(xiang)(xiang)工(gong)(gong)程(cheng)(cheng)(cheng)(cheng)而言,大意是(shi)(shi)根據已有的(de)東西和結(jie)果,通過分析來推導出(chu)(chu)具體的(de)實現方法。 在我(wo)們現實的(de)軟(ruan)(ruan)件世界(jie)里,比如(ru)(ru)從(cong)某個能(neng)夠做(zuo)出(chu)(chu)某種動畫(hua)效(xiao)果的(de)可(ke)執(zhi)行程(cheng)(cheng)(cheng)(cheng)序(.exe/elf),通過反匯編、反編譯(yi)和動態跟蹤等(deng)技(ji)術方法,分析出(chu)(chu)其(qi)動 畫(hua)效(xiao)果的(de)實現過程(cheng)(cheng)(cheng)(cheng),這(zhe)種行為就是(shi)(shi)逆(ni)向(xiang)(xiang)(xiang)工(gong)(gong)程(cheng)(cheng)(cheng)(cheng);不僅僅是(shi)(shi)反編譯(yi),而且(qie)(qie)還(huan)要推倒出(chu)(chu)設(she)計,并且(qie)(qie)文(wen)檔(dang)化,逆(ni)向(xiang)(xiang)(xiang)軟(ruan)(ruan)件工(gong)(gong)程(cheng)(cheng)(cheng)(cheng)的(de)目的(de)是(shi)(shi)使軟(ruan)(ruan)件得以維(wei)護。再比如(ru)(ru) Java代(dai)碼(ma)或C#代(dai)碼(ma)通過逆(ni)向(xiang)(xiang)(xiang)構建(jian) UML 類(lei)及序列(lie)圖(tu)(tu)時(shi),能(neng)夠使得技(ji)術人(ren)員(yuan)改動代(dai)碼(ma)的(de)同時(shi)實時(shi)更新建(jian)模圖(tu)(tu)形的(de)變化。技(ji)術人(ren)員(yuan)往往通過IBM® Rational® Software Architect 將 Java源代(dai)碼(ma)做(zuo)逆(ni)向(xiang)(xiang)(xiang)工(gong)(gong)程(cheng)(cheng)(cheng)(cheng)生成 UML 類(lei)和序列(lie)圖(tu)(tu),通過.Net / Visio軟(ruan)(ruan)件工(gong)(gong)具將C#源代(dai)碼(ma)做(zuo)逆(ni)向(xiang)(xiang)(xiang)工(gong)(gong)程(cheng)(cheng)(cheng)(cheng)諸如(ru)(ru)此類(lei)。
4.2 Unity集(ji)成(cheng)環境(jing)的屬性查看器
明白了(le)上面(mian)提到的(de)軟件工程思想(xiang)后,讓我們瞧一瞧Unity是如何體現(xian)這一點的(de)。

上面的圖說(shuo)明的是: 用戶能夠(gou)通(tong)過(guo)操作Unity的環境菜單生成C#腳(jiao)本文件(jian);反之,用戶又可以通(tong)過(guo)修改腳(jiao)本文件(jian)來改動(dong)Inspector面板的布局。比如, 正如圖中顯示的腳(jiao)本文件(jian)中增加了Test類,在(zai)Inspector面板中有相應(ying)的更新(xin)顯示。此外,如果用戶對(dui)(dui)缺省的面板風格(ge)不滿(man)意(yi),用戶還能夠(gou)通(tong)過(guo)在(zai)腳(jiao)本 文件(jian)中繼承Editor類的方法對(dui)(dui)監視面板進行大幅度的改動(dong)。我們能夠(gou)看到,這里充分體現了反向工(gong)程的設計思路。
5 單實例設計模(mo)式(shi)
5.1 設計(ji)模(mo)式
按照設計(ji)模(mo)式總結(jie)的(de)(de)(de)幾大類軟件模(mo)式設計(ji)角度,單(dan)例模(mo)式是一(yi)種對象創建模(mo)式,它(ta)用于產生(sheng)一(yi)個(ge)對象的(de)(de)(de)具(ju)體實(shi)(shi)例,它(ta)可以確(que)保(bao)系統中一(yi)個(ge)類只產生(sheng)一(yi) 個(ge)實(shi)(shi)例。比(bi)如(ru)說,Java 里面(mian)實(shi)(shi)現的(de)(de)(de)單(dan)例是一(yi)個(ge)虛(xu)擬(ni)機的(de)(de)(de)范圍,因為(wei)裝載(zai)類的(de)(de)(de)功能是虛(xu)擬(ni)機的(de)(de)(de),所以一(yi)個(ge)虛(xu)擬(ni)機在(zai)通過自己的(de)(de)(de) ClassLoad 裝載(zai)實(shi)(shi)現單(dan) 例類的(de)(de)(de)時候就會創建一(yi)個(ge)類的(de)(de)(de)實(shi)(shi)例。在(zai) Java 語(yu)言中,這樣的(de)(de)(de)行(xing)為(wei)能帶(dai)來兩大好(hao)處:
1 對(dui)于頻繁使用的對(dui)象,可(ke)以省略(lve)創建對(dui)象所花費的時間,這對(dui)于那些重(zhong)量(liang)級對(dui)象而言,是非常(chang)可(ke)觀的一筆系(xi)統開銷;
2 由于 new 操作(zuo)的(de)次(ci)數減少,因(yin)而(er)對系(xi)統內(nei)存的(de)使用頻率(lv)也會降(jiang)低,這將減輕 GC (指JVM的(de)內(nei)存回收算(suan)法)壓(ya)力,縮短 GC 停頓(dun)時間。
因此(ci)對于(yu)系統的(de)(de)關(guan)鍵組件和被頻繁使用的(de)(de)對象,使用單例(li)模(mo)式可以有效地改善(shan)系統的(de)(de)性能。單例(li)模(mo)式的(de)(de)核心在于(yu)通過一個接口返回(hui)唯(wei)一的(de)(de)對象實例(li)。
5.2 Unity的單實(shi)例運用
在Unity的(de)(de)(de)集成開(kai)發(fa)環境中,對(dui)IDE環境的(de)(de)(de)配置(zhi)可(ke)以通過偏(pian)好(Preferences)選項窗口進(jin)行全局(ju)(ju)性的(de)(de)(de)配置(zhi),包括(kuo)編(bian)輯器的(de)(de)(de)選擇,顏色(se)的(de)(de)(de)選擇,快捷鍵的(de)(de)(de) 設置(zhi)等(deng)等(deng),這些配置(zhi)信(xin)息(xi)保存(cun)到配置(zhi)文件中構建(jian)了全局(ju)(ju)唯一的(de)(de)(de)配置(zhi)實例。

比如外部工(gong)具(ju)選(xuan)擇的(de)腳本編譯器選(xuan)項,在(zai)Mac系統環境(jing)下,可以選(xuan)擇MonoDevelop或(huo)(huo)者Xamarin Studio兩(liang)種開(kai)(kai)發(fa)(fa)工(gong)具(ju),相應地(di)Windows系統環境(jing)下,可以 選(xuan)擇MonoDevelop或(huo)(huo)者Visual Studio兩(liang)種IDE開(kai)(kai)發(fa)(fa)環境(jing)。這種設(she)(she)計(ji)思路往往在(zai)很多(duo)的(de)可視化工(gong)具(ju)設(she)(she)計(ji)環境(jing)當中,我們能夠(gou)找到很好(hao)的(de)例子。另外,這里 展現的(de)Unity環境(jing)一(yi)個不同于(yu)其(qi)它(ta)環境(jing)的(de)特點就(jiu)是考慮了設(she)(she)計(ji)工(gong)具(ju)的(de)協同工(gong)作,直(zhi)接和(he)其(qi)它(ta)現成的(de)優秀開(kai)(kai)發(fa)(fa)工(gong)具(ju)一(yi)道為項目開(kai)(kai)發(fa)(fa)更(geng)好(hao)地(di)服務。
6 組件(jian)化設(she)計
6.1 模塊化設計
早在(zai)C語(yu)言大(da)行其道(dao)的(de)時代,基于模塊化的(de)設計思想(xiang)受(shou)到(dao)了很大(da)的(de)歡(huan)迎(ying)。通(tong)過接(jie)口和實(shi)(shi)現分離的(de)形式,在(zai)項(xiang)目開發(fa)實(shi)(shi)踐中得到(dao)了廣泛的(de)運用。微(wei)軟(ruan)公司 倡導的(de)基于構件(Component)或組件的(de)開發(fa)模式,構建了微(wei)軟(ruan)操作系(xi)統的(de)設計哲學,尤其是(shi).Net生(sheng)態系(xi)統,從早期(qi)低(di)效的(de)ActiveX控件到(dao)com, 到(dao)現在(zai) 的(de)com+,直到(dao).Net的(de)成熟(shu),微(wei)軟(ruan)公司把組件對象(xiang)模型技術(shu)發(fa)揮的(de)淋(lin)漓(li)盡致。
但好多技術(shu)人員還(huan)是(shi)把模(mo)(mo)(mo)塊(kuai)(kuai)化和(he)組件(jian)化混為一談,兩者有著共性(xing)和(he)個性(xing)。兩者理解上(shang)是(shi)否存在(zai)差(cha)異(yi)往往取決專業背景、所在(zai)領域、以(yi)及(ji)視(shi)角。 從設計(ji)(ji)上(shang)來(lai)看,組件(jian)強(qiang)調復(fu)用,模(mo)(mo)(mo)塊(kuai)(kuai)強(qiang)調職責(內聚(ju)、分(fen)離),或(huo)者說組件(jian)是(shi)達(da)到可(ke)復(fu)用要求(qiu)的(de)模(mo)(mo)(mo)塊(kuai)(kuai)。模(mo)(mo)(mo)塊(kuai)(kuai)或(huo)模(mo)(mo)(mo)組(Module)的(de)核心意(yi)義(yi)是(shi)分(fen)離職責, 屬(shu)于代碼級模(mo)(mo)(mo)塊(kuai)(kuai)化的(de)產出。本身是(shi)一組具有一定內聚(ju)性(xing)代碼的(de)組合,職責明確。對外(wai)的(de)接口可(ke)以(yi)是(shi)松散的(de),也(ye)(ye)(ye)可(ke)以(yi)是(shi)集中的(de)。SEI的(de)定義(yi)為:提供(gong)一組 連貫的(de)職責的(de)軟(ruan)件(jian)的(de)實現單(dan)元(yuan)。它(ta)以(yi)問(wen)題分(fen)解的(de)形式,來(lai)解決軟(ruan)件(jian)設計(ji)(ji)問(wen)題。它(ta)更強(qiang)調一個內聚(ju)的(de)概念(nian)(nian),形式上(shang)類似(si)于Java語言中的(de)包概念(nian)(nian),也(ye)(ye)(ye)可(ke)以(yi) 是(shi)一個源代碼目(mu)錄(lu)(C語言也(ye)(ye)(ye)是(shi))。
組件或者構件(Component)使用(yong)比較廣泛,它的(de)核心(xin)意義在于(yu)復用(yong),相(xiang)對(dui)模塊,對(dui)于(yu)依賴(lai)性有更高的(de)要求。概(gai)念上與模塊基本(ben)等同,只是明顯(xian)有依賴(lai)性 的(de)要求。(早(zao)提出時概(gai)念)。
6.2 Unity的組件化應用
Unity的(de)設(she)計把組件化的(de)軟件工程設(she)計思想(xiang)進(jin)行(xing)了(le)充分的(de)發揮,Unity環境(jing)內置了(le)打(da)包器(Packer)和(he)解包器(Unpacker),技(ji)術開(kai)(kai)發人員可以(yi)將自(zi)己 制作的(de)插件打(da)包成.unitypackage的(de)格式,然后(hou)進(jin)行(xing)網站上的(de)發布供(gong)其它開(kai)(kai)發人員導入。

圖 10 臉譜(pu)的Oculus VR產品
比如說,Vuforia是一款由Qualcomm推出的(de)(de)AR應用(yong)開發(fa)工具,能將(jiang)(jiang)現實(shi)世(shi)界物(wu)體(ti)轉變為互動(dong)體(ti)驗的(de)(de)擴增實(shi)境(jing)平臺,旨在(zai)幫助開發(fa)者打(da)造(zao)全新級別的(de)(de)真實(shi) 世(shi)界物(wu)品(pin)與虛(xu)擬物(wu)品(pin)的(de)(de)互動(dong)。Vuforia SDK可以通過官方(fang)網站進(jin)行(xing)下載(圖(tu)(tu)中的(de)(de)vuforia-unity-6-0-117.unitypackage名稱),開發(fa)者能夠在(zai)Unity的(de)(de) 環境(jing)下,通過下圖(tu)(tu)中的(de)(de)菜單彈出窗口將(jiang)(jiang)該(gai)軟件(jian)包導入項(xiang)目選項(xiang)卡窗口中去。與此同時,也將(jiang)(jiang)解壓后(hou)的(de)(de)很(hen)多資源文件(jian)導入了項(xiang)目。

7 可擴展性設計
7.1 概要思路
可擴展(zhan)性設(she)(she)(she)(she)計(ji)(ji)與(yu)(yu)實現是軟件工程(cheng)所(suo)倡導的(de)(de)(de)重要設(she)(she)(she)(she)計(ji)(ji)原則之一(yi)。若要完(wan)美地達成(cheng)設(she)(she)(she)(she)計(ji)(ji)目標,需要與(yu)(yu)面向(xiang)對(dui)象的(de)(de)(de)設(she)(she)(she)(she)計(ji)(ji)、模(mo)(mo)塊化(hua)(hua)或組件化(hua)(hua)的(de)(de)(de)設(she)(she)(she)(she)計(ji)(ji)思維、設(she)(she)(she)(she)計(ji)(ji) 模(mo)(mo)式等(deng)軟件設(she)(she)(she)(she)計(ji)(ji)思想結合起來進行充分(fen)的(de)(de)(de)運用(yong)(yong)和(he)發揮。面向(xiang)對(dui)象設(she)(she)(she)(she)計(ji)(ji)的(de)(de)(de)OCP(開(kai)(kai)-閉原則)設(she)(she)(she)(she)計(ji)(ji)原則,就是一(yi)個很(hen)好的(de)(de)(de)例證。在C++類庫實現的(de)(de)(de)過程(cheng)中(zhong), 公開(kai)(kai)的(de)(de)(de)接口和(he)封閉接口的(de)(de)(de)需要針對(dui)用(yong)(yong)戶(hu)的(de)(de)(de)取(qu)得平衡。軟件功能模(mo)(mo)塊劃(hua)分(fen)的(de)(de)(de)“緊內聚(ju),松(song)耦合”,通用(yong)(yong)的(de)(de)(de)部分(fen)做成(cheng)平臺模(mo)(mo)塊,不同盡量實現成(cheng)可配(pei)置模(mo)(mo) 塊。還有設(she)(she)(she)(she)計(ji)(ji)模(mo)(mo)式當中(zhong)的(de)(de)(de)適配(pei)器模(mo)(mo)式等(deng)等(deng),所(suo)有都很(hen)好地體現了可擴展(zhan)性設(she)(she)(she)(she)計(ji)(ji)的(de)(de)(de)思路。
7.2 Unity的可擴(kuo)展性體現(xian)
7.2.1 Unity的Gizmos
Unity的(de)Gizmos類可在(zai)Scene視口(kou)中(zhong)繪(hui)制(zhi)(zhi)圖(tu)像用來顯示設計細節。利用Gizmos.DrawIcon函(han)數可以在(zai)場(chang)景視口(kou)中(zhong)繪(hui)制(zhi)(zhi)一(yi)個(ge)圖(tu)標以標記特殊的(de)對象和位置(zhi)。 該函(han)數使用的(de)圖(tu)像文件(jian)需要位于 Gizmos中(zhong)。
下圖中,Unity開發環(huan)境中的Gizmos按鈕所涉(she)及到的基于(yu)Gizmos類(lei)的繪制射線,線段,網(wang)格(ge)球體(ti)(ti),實體(ti)(ti)球體(ti)(ti),網(wang)格(ge)立(li)方(fang)體(ti)(ti),實體(ti)(ti)立(li)方(fang)體(ti)(ti),圖標,GUI紋 理,以及攝像機(ji)線框(kuang)。但有些特(te)殊的場景視圖,用戶只能夠自己(ji)編碼實現定制化的Gizmos類(lei)實例(li)。

7.2.2 Unity的編譯(yi)擴(kuo)展方(fang)式
再舉(ju)個(ge)例(li)子就是Unity對腳本擴(kuo)展的實現方式。
通常情況下,Editor 文件夾(jia)中(zhong)的(de)(de)(de)腳(jiao)(jiao)本主要(yao)用(yong)(yong)(yong)來擴(kuo)展(zhan)unity編輯(ji)器的(de)(de)(de)功(gong)(gong)(gong)能方便開發(fa)。這些(xie)腳(jiao)(jiao)本將不會打包進終發(fa)布的(de)(de)(de)游戲中(zhong)。項(xiang)目中(zhong)可以使用(yong)(yong)(yong)多個 Editor 文件夾(jia),但是(shi)該文件夾(jia)中(zhong)的(de)(de)(de)腳(jiao)(jiao)本不允許用(yong)(yong)(yong)當GameObject對象的(de)(de)(de)組件(Component)。Plugins 文件夾(jia)中(zhong)存(cun)放用(yong)(yong)(yong)于(yu)擴(kuo)展(zhan)unity功(gong)(gong)(gong)能的(de)(de)(de)插件(多為(wei) C/C++寫成的(de)(de)(de)原(yuan)生動態(tai)鏈接庫(DLLs))。這些(xie)插件可以訪問第(di)三(san)方代(dai)碼庫,系統(tong)API以及其他(ta)超出Unity功(gong)(gong)(gong)能的(de)(de)(de)模塊。
在(zai)unity開發中,有的時候(hou)定制(zhi)項目文件夾(jia)以管理游戲資源(yuan),包括代碼(ma)資源(yuan)。但unity保留了一些特(te)殊文件夾(jia)用來(lai)做特(te)殊用途,例如編(bian)譯順序。
Unity的腳本(ben)編(bian)譯(yi)有4個階(jie)段(duan)(phase),腳本(ben)處在哪個編(bian)譯(yi)階(jie)段(duan)取(qu)決于(yu)腳本(ben)所在的文件夾。如果(guo)你的一些(xie)腳本(ben)需(xu)要(yao)引(yin)用一些(xie)別(bie)的文件夾中定義(yi)的類(lei),則 需(xu)要(yao)關(guan)心(xin)他(ta)們的編(bian)譯(yi)順序。你引(yin)用的類(lei)需(xu)要(yao)先于(yu)你的當前(qian)類(lei)編(bian)譯(yi)。或者當你需(xu)要(yao)引(yin)用其他(ta)語(yu)言的腳本(ben)時,那(nei)么該腳本(ben)必須處于(yu)更早的編(bian)譯(yi)階(jie)段(duan)。
Unity中的(de)(de)4個編譯(yi)階段(duan)如下(類(lei)似(si)于X Windows應用對(dui)資源文件的(de)(de)查找方式):
1.處于 Standard Assets, Pro Standard Assets 和 Plugins 文件夾(jia)中的(de)運行時腳本(Standard Assets 文件夾(jia)需是Assets的(de)一(yi) 級子(zi)文件夾(jia));
2.處于(yu) Standard Assets, Pro Standard Assets 和 Plugins 文件夾下的以 Editor 命名的一級 子文件夾中(zhong)的腳本;
3.頂級 Editor 文件夾中的腳本;
4.其他 Editor 文(wen)件(jian)夾(jia)中(zhong)的腳本(例如其他文(wen)件(jian)夾(jia)下(xia)的以 Editor 命名的子文(wen)件(jian)夾(jia)) 另外(wai)在 Assets 文(wen)件(jian)夾(jia)中(zhong)以 WebPlayerTemplates 命名的頂級子文(wen)件(jian)(即Assets/WebPlayerTemplates)將(jiang)不會(hui)編譯(yi)。若是處(chu)于(yu)別的文(wen)件(jian)夾(jia)下(xia)的 WebPlayerTemplates (如Assets/Scripts/WebPlayerTemplates)將(jiang)不會(hui)防止編譯(yi)。
8 面向對象的設計
8.1 面向對象設計思想(xiang)
眾所周知,封裝(zhuang)、繼(ji)承和多態是面向對象語言設計的(de)三大原(yuan)則。微軟在早期的(de)Visual C++版本就支持了(le)通過類繼(ji)承機制構建的(de)龐大MFC類庫,如今(jin) 的(de).Net類庫包含了(le)這種思(si)想(xiang)。如今(jin)流行的(de)C++,Java,Python,Ruby等程序設計語言都支持面向對象思(si)想(xiang)的(de)程序設計思(si)想(xiang)。
8.2 Unity的(de)類庫(ku)實(shi)現
下圖(tu)Unity的類庫遵照典型的類層次關系圖(tu),圖(tu)中的符號(hao)含義如下:


所有類(lei)(lei)的(de)抽象(xiang)基類(lei)(lei)Object,游戲場景中(zhong)所放置的(de)所有游戲對象(xiang)皆從此類(lei)(lei)繼承而來,有點類(lei)(lei)似(si)于蘋果系(xi)統中(zhong)的(de)NSObject (面向對象(xiang)C的(de)基類(lei)(lei))。Unity開(kai)發 工程中(zhong)涉及用到(dao)的(de)動畫、攝像機、燈(deng)光(guang)、腳本(ben)行(xing)為(wei)、粒子渲(xuan)染(ran)、碰撞(zhuang)器(qi)、剛(gang)體、變換、材(cai)料、網格、著色器(qi)和(he)渲(xuan)染(ran)器(qi)等等均按照類(lei)(lei)的(de)繼承和(he)組合關系(xi) 實現的(de)。
9 結論
本文試圖帶(dai)領(ling)初(chu)涉(she)Unity開(kai)發(fa)的(de)技術人員或(huo)工(gong)(gong)(gong)程師(shi),站在軟件工(gong)(gong)(gong)程設(she)計和實現的(de)角度,從(cong)多個視角挖掘和體會一下Unity集成開(kai)發(fa)環(huan)境(jing)中所(suo)蘊含的(de)思想 ,為技術人員更(geng)好(hao)的(de)利用該環(huan)境(jing)進行各個領(ling)域(yu)的(de)開(kai)發(fa)打下良好(hao)的(de)工(gong)(gong)(gong)具(ju)使用基礎(chu)。
供(gong)讀者參考資料:
[1] //en.wikipedia.org/wiki/Interactive_programming
[2] //baike.baidu.com/item/Ruby/11419
[3] //www.ruby-lang.org/zh_cn
[4] //www.ibm.com/developerworks/cn/java/j-lo-Singleton/index.html

