Unity 5.x游戲開(kāi)發(fā)實(shí)戰(zhàn)_第1頁(yè)
Unity 5.x游戲開(kāi)發(fā)實(shí)戰(zhàn)_第2頁(yè)
Unity 5.x游戲開(kāi)發(fā)實(shí)戰(zhàn)_第3頁(yè)
Unity 5.x游戲開(kāi)發(fā)實(shí)戰(zhàn)_第4頁(yè)
Unity 5.x游戲開(kāi)發(fā)實(shí)戰(zhàn)_第5頁(yè)
已閱讀5頁(yè),還剩372頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Unity5.x游戲開(kāi)發(fā)實(shí)戰(zhàn)目錄\h第1章金幣采集游戲(Ⅰ)\h1.1游戲設(shè)計(jì)\h1.2從頭開(kāi)始——Unity中的項(xiàng)目\h1.3項(xiàng)目和項(xiàng)目文件夾\h1.4開(kāi)始一個(gè)關(guān)卡\h1.5變換和導(dǎo)航\h1.6場(chǎng)景的建立\h1.7光源和天空\(chéng)h1.8游戲測(cè)試與游戲選項(xiàng)卡\h1.9添加一個(gè)水平面\h1.10添加一個(gè)用來(lái)采集的金幣\h1.11小結(jié)\h第2章金幣采集游戲(Ⅱ)\h2.1創(chuàng)建一個(gè)金幣的材質(zhì)\h2.2Unity中的C#腳本\h2.3對(duì)金幣進(jìn)行計(jì)數(shù)\h2.4金幣采集\h2.5金幣與預(yù)設(shè)體\h2.6定時(shí)器和倒計(jì)時(shí)\h2.7慶典和焰火\h2.8游戲測(cè)試\h2.9構(gòu)建\h2.10小結(jié)\h第3章太空射擊游戲(Ⅰ)\h3.1對(duì)完整的項(xiàng)目進(jìn)行展望\h3.2開(kāi)始太空射擊游戲\h3.3創(chuàng)建玩家對(duì)象\h3.4Player輸入\h3.5配置游戲中的攝像機(jī)\h3.6范圍的鎖定\h3.7生命值\h3.8死亡和粒子系統(tǒng)\h3.9敵人\h3.10批量產(chǎn)生敵人\h3.11小結(jié)\h第4章太空射擊游戲(Ⅱ)\h4.1武器與炮塔\h4.2炮彈預(yù)設(shè)體\h4.3炮彈的產(chǎn)生\h4.4用戶控制\h4.5分?jǐn)?shù)和評(píng)分——UI和文本對(duì)象\h4.6計(jì)分功能——為文本對(duì)象編寫腳本\h4.7游戲的潤(rùn)色\h4.8測(cè)試與調(diào)試\h4.9游戲的構(gòu)建\h4.10小結(jié)\h第5章二維冒險(xiǎn)游戲(Ⅰ)\h5.1二維冒險(xiǎn)游戲——開(kāi)始\h5.2資源的導(dǎo)入\h5.3開(kāi)始創(chuàng)建游戲的環(huán)境\h5.4環(huán)境物理學(xué)\h5.5創(chuàng)建一個(gè)玩家\h5.6編寫控制玩家移動(dòng)的腳本\h5.7優(yōu)化\h5.8小結(jié)\h第6章二維冒險(xiǎn)游戲(Ⅱ)\h6.1移動(dòng)的平臺(tái)\h6.2創(chuàng)建其他的場(chǎng)景——關(guān)卡2和關(guān)卡3\h6.3死亡區(qū)域\h6.4用戶界面中的生命值條\h6.5炮彈和傷害\h6.6炮塔和炮彈\h6.7NPC和任務(wù)系統(tǒng)\h6.8小結(jié)\h第7章有智慧的敵人(Ⅰ)\h7.1項(xiàng)目概覽\h7.2入門指南\h7.3地形的構(gòu)建\h7.4導(dǎo)航與導(dǎo)航網(wǎng)格\h7.5構(gòu)建一個(gè)NPC\h7.6創(chuàng)建巡邏的NPC\h7.7小結(jié)\h第8章有智慧的敵人(Ⅱ)\h8.1敵人的人工智能——視野范圍\h8.2有限狀態(tài)機(jī)概述\h8.3巡邏狀態(tài)\h8.4追逐狀態(tài)\h8.5攻擊狀態(tài)\h8.6小結(jié)第1章金幣采集游戲(Ⅰ)本章將會(huì)以一個(gè)十分有趣的采集類游戲作為Unity的入門。即使你以前從來(lái)都沒(méi)有使用過(guò)Unity這個(gè)游戲引擎,也無(wú)需有任何的擔(dān)心。我們的教程將會(huì)一步一步地來(lái)指導(dǎo)你熟悉Unity。到了下一章結(jié)束的時(shí)候,你就可以利用所學(xué)的內(nèi)容構(gòu)造出一個(gè)比較簡(jiǎn)單但是功能相當(dāng)完善的游戲。這將是一個(gè)非常重要的過(guò)程,因?yàn)樵趶氖贾两K的開(kāi)發(fā)中,你將會(huì)了解到整個(gè)游戲的實(shí)現(xiàn)流程。在本章中將會(huì)學(xué)習(xí)到如下內(nèi)容:Unity游戲的設(shè)計(jì)Unity項(xiàng)目和目錄Unity資源(Asset)的導(dǎo)入和配置Unity游戲關(guān)卡的設(shè)計(jì)Unity游戲設(shè)計(jì)中的對(duì)象Unity中的結(jié)構(gòu)樹(Hierarchies)1.1游戲設(shè)計(jì)現(xiàn)在就來(lái)開(kāi)始游戲的開(kāi)發(fā)之旅吧。首先,這是一個(gè)第一人稱視角的游戲,玩家必須在規(guī)定時(shí)間內(nèi)通過(guò)不斷地移動(dòng)去采集所有的金幣。如果玩家在時(shí)間耗盡時(shí)還沒(méi)有采集到所有金幣,則視為玩家失敗,游戲結(jié)束。如果玩家在時(shí)間耗盡之前就將全部的金幣采集完畢,則視為玩家勝利。這款游戲的方向控制采用標(biāo)準(zhǔn)“WASD”的模式,按下“W”鍵向前運(yùn)動(dòng),按下“A”鍵向左運(yùn)動(dòng),按下“S”鍵向右運(yùn)動(dòng),按下“D”鍵向后運(yùn)動(dòng)。視角的變換由鼠標(biāo)控制,當(dāng)走到金幣的位置時(shí)就可以完成金幣的采集。如圖1.1所示,采用Unity編輯器實(shí)現(xiàn)對(duì)游戲行為的設(shè)計(jì)。開(kāi)發(fā)這個(gè)游戲的最大優(yōu)勢(shì)就在于,通過(guò)整個(gè)的開(kāi)發(fā)過(guò)程,可以了解到Unity的全部關(guān)鍵特性,同時(shí)無(wú)需使用任何額外的軟件來(lái)產(chǎn)生游戲所需的資源(Asset),例如貼圖(Textures)、網(wǎng)格(Meshes)以及材質(zhì)(Materials)等。圖1.1金幣采集游戲(最終完成效果)本章和下一章介紹了這個(gè)金幣采集游戲的開(kāi)發(fā)過(guò)程,關(guān)于這個(gè)金幣采集游戲的完整代碼,可以在本書的配套文件Chapter01/CollectionGame目錄下找到。1.2從頭開(kāi)始——Unity中的項(xiàng)目當(dāng)在Unity中創(chuàng)建一個(gè)新游戲時(shí),如現(xiàn)在的金幣采集游戲,都需要先創(chuàng)建一個(gè)新的項(xiàng)目。一般來(lái)說(shuō),Unity中的“項(xiàng)目”這個(gè)詞就等同于“游戲”。在Unity中有兩種方法來(lái)創(chuàng)建一個(gè)新的項(xiàng)目,但其實(shí)這兩者并沒(méi)有太大的差別。在打開(kāi)的Unity的圖形化編輯界面中,可以看到一個(gè)場(chǎng)景或者關(guān)卡,從應(yīng)用菜單上依次選擇“File|NewProject”,如圖1.2所示。這時(shí)Unity會(huì)詢問(wèn)是否對(duì)當(dāng)前已經(jīng)打開(kāi)的項(xiàng)目進(jìn)行保存,這時(shí)需要根據(jù)自己的實(shí)際情況來(lái)選擇“Yes”或者“No”。在選擇完“NewProject”以后,Unity將會(huì)出現(xiàn)一個(gè)項(xiàng)目創(chuàng)建向?qū)?,根?jù)這個(gè)向?qū)У囊?,就可以一步一步完成?xiàng)目的創(chuàng)建工作了。圖1.2使用主菜單來(lái)創(chuàng)建一個(gè)新的項(xiàng)目如果是第一次啟動(dòng)Unity,則會(huì)看到一個(gè)歡迎的對(duì)話框,如圖1.3所示。在這個(gè)對(duì)話框中,可以通過(guò)選擇“NEWPROJECT”按鈕來(lái)創(chuàng)建新的項(xiàng)目。圖1.3Unity的歡迎界面選擇“NEWPROJECT”創(chuàng)建向?qū)е螅琔nity就會(huì)按照指定的一些基本設(shè)置來(lái)創(chuàng)建一個(gè)新的項(xiàng)目。此處需要填寫項(xiàng)目的名稱(例如CollectionGame),然后在電腦上選擇一個(gè)用來(lái)保存自動(dòng)生成項(xiàng)目文件的文件夾。最后,注意3D和2D的這兩個(gè)按鈕,當(dāng)單擊3D按鈕時(shí),這意味著要?jiǎng)?chuàng)建的是一個(gè)三維游戲;如果單擊的是2D按鈕,這意味著將要?jiǎng)?chuàng)建一個(gè)二維的游戲,所有這些步驟都完成之后,需要單擊“Createproject”按鈕來(lái)完成整個(gè)項(xiàng)目的生成過(guò)程,如圖1.4所示。圖1.4創(chuàng)建一個(gè)新的項(xiàng)目1.3項(xiàng)目和項(xiàng)目文件夾現(xiàn)在Unity已經(jīng)創(chuàng)建了一個(gè)空白的新項(xiàng)目。這里就是開(kāi)發(fā)一個(gè)新游戲的起點(diǎn),在這個(gè)新創(chuàng)建的項(xiàng)目中并不包含任何的東西,沒(méi)有任何的網(wǎng)格,貼圖或者其他資源。這一點(diǎn)只需要檢查一下位于Unity編輯器界面下方的項(xiàng)目(Project)面板區(qū)域就可以確定。這個(gè)項(xiàng)目(Project)面板中會(huì)顯示項(xiàng)目文件夾中的全部資源,同時(shí)它也對(duì)應(yīng)著一個(gè)本地驅(qū)動(dòng)器上的文件夾,而這個(gè)文件夾就是在之前項(xiàng)目向?qū)е兴鶆?chuàng)建的。這個(gè)文件夾如圖1.5所示,現(xiàn)在也是空的。在這個(gè)游戲的開(kāi)發(fā)過(guò)程中,還會(huì)使用到這個(gè)項(xiàng)目(Project)面板中的更多功能。圖1.5位于Unity開(kāi)發(fā)界面的底部的項(xiàng)目(Project)面板如果現(xiàn)在使用的Unity開(kāi)發(fā)界面的布局與圖1.5所示的有些不同,那么可以選擇將用戶開(kāi)發(fā)界面的布局進(jìn)行重置,恢復(fù)為默認(rèn)布局。只需要單擊開(kāi)發(fā)界面右上角的布局下拉菜單,然后再選擇“Default”,見(jiàn)圖1.6。圖1.6切換成默認(rèn)的開(kāi)發(fā)界面布局可以在Windows操作系統(tǒng)下的資源管理器或者M(jìn)ac操作系統(tǒng)中的Finder直接查看到項(xiàng)目文件夾中的內(nèi)容。要做到這一點(diǎn),只需要在Unity編輯器上的項(xiàng)目(Project)面板中單擊鼠標(biāo)右鍵,這時(shí)就會(huì)顯示出一個(gè)內(nèi)容菜單,然后在這個(gè)菜單上選擇選項(xiàng)“ShowinExplorer”,這個(gè)過(guò)程如圖1.7所示。圖1.7使用項(xiàng)目(Project)面板顯示項(xiàng)目文件夾單擊“ShowinExplorer”可以在默認(rèn)的系統(tǒng)文件瀏覽器中對(duì)文件夾中的內(nèi)容進(jìn)行瀏覽,如圖1.8所示。以這種方式查看文件,可以更容易地實(shí)現(xiàn)對(duì)文件的檢查、清點(diǎn)或者備份操作。但是,不要在Windows操作系統(tǒng)下的資源管理器或者M(jìn)ac操作系統(tǒng)中的Finder中對(duì)文件夾中的內(nèi)容進(jìn)行修改,尤其是不要進(jìn)行移動(dòng)、重命名或者刪除文件的操作,這樣操作可能會(huì)導(dǎo)致Unity項(xiàng)目損壞。如果進(jìn)行文件的刪除和移動(dòng)操作,就在Unity編輯器中的項(xiàng)目(Project)面板中進(jìn)行。只有這樣操作,Unity才會(huì)同時(shí)對(duì)它的元數(shù)據(jù)進(jìn)行更新,以確保項(xiàng)目能繼續(xù)正常工作。圖1.8從操作系統(tǒng)的文件瀏覽器中查看項(xiàng)目(Project)面板的內(nèi)容如果是從操作系統(tǒng)的文件瀏覽器中查看項(xiàng)目文件夾,就可以看到一些在項(xiàng)目(Project)面板中看不到的文件和文件夾,例如Library文件夾、ProjectSettings文件夾或者Temp文件夾。這些文件夾中保存的都是項(xiàng)目的元數(shù)據(jù)。這些文件并不是項(xiàng)目直接的組成部分,但是卻包含一些額外的設(shè)置和首選項(xiàng)信息,這些信息保證了Unity能正常運(yùn)行。注意,不要試圖對(duì)這些文件夾和其中的文件進(jìn)行修改或者編輯。資源的導(dǎo)入資源是游戲開(kāi)發(fā)中的原材料,也就是組成游戲的模塊。Unity中的資源包括網(wǎng)格(或者3D模型)、貼圖、各種音樂(lè)和音效、場(chǎng)景,其中網(wǎng)格包括各種人物、道具、植物、建筑物等;貼圖包括各種JPEG文件和PNG文件,這些圖片決定了網(wǎng)格的外觀;音樂(lè)和音效用來(lái)提高游戲真實(shí)性和氣氛;場(chǎng)景(Scene)是一個(gè)網(wǎng)格、紋理、音樂(lè)、音效等協(xié)同工作而組成的獨(dú)立系統(tǒng)。因此可以這樣說(shuō),游戲不能沒(méi)有資源,否則這些游戲看起來(lái)空虛而又無(wú)趣?;谶@個(gè)原因,金幣采集游戲也同樣需要資源。畢竟這個(gè)游戲需要一個(gè)可以在其中進(jìn)行移動(dòng)和采集操作的環(huán)境。Unity只是一個(gè)游戲開(kāi)發(fā)引擎,而并非是一個(gè)資源開(kāi)發(fā)軟件。這意味著在游戲中需要的資源(例如各種人物、道具),通常是由一些設(shè)計(jì)者使用其他軟件開(kāi)發(fā)出來(lái)的。然后,這些設(shè)計(jì)者將這些制作好的資源導(dǎo)出,并傳遞給Unity。Unity則負(fù)責(zé)將這些資源有機(jī)地組合到一個(gè)游戲系統(tǒng)中。這些用來(lái)設(shè)計(jì)3D模型資源的第三方軟件包括Blender(這是一款免費(fèi)的軟件)、Maya或者3DMAX。而對(duì)于紋理的創(chuàng)建,可以選擇Photoshop或者GIMP(這也是一款免費(fèi)的軟件)。至于音效的制作,可以選擇使用Audacity(這款軟件同樣是免費(fèi)的)。當(dāng)然除了這些軟件以外,還有更多的選擇。這些軟件的具體內(nèi)容并不在本書的范圍內(nèi)。通常,Unity引擎會(huì)認(rèn)為已經(jīng)有了可以導(dǎo)入到游戲中的資源。例如,在金幣采集的游戲中將使用Unity所提供的資源?,F(xiàn)在,將這些資源導(dǎo)入到這個(gè)項(xiàng)目中,為此,需要首先選擇菜單欄上的“Assets”選項(xiàng),然后在下拉菜單上選中“ImportPackage”,然后如圖1.9所示依次選中“Characters”“ParticleSystems”“Environment”和“Prototyping”等選項(xiàng)。圖1.9使用資源包導(dǎo)入(ImportPackage)菜單完成資源導(dǎo)入操作當(dāng)在菜單中進(jìn)行一個(gè)資源包的導(dǎo)入操作時(shí),都會(huì)出現(xiàn)一個(gè)導(dǎo)入操作的對(duì)話框。在這個(gè)對(duì)話框中無(wú)需進(jìn)行任何改動(dòng),保留里面設(shè)置的默認(rèn)值,然后單擊“Import”按鈕即可。這個(gè)過(guò)程如圖1.10所示。圖1.10選擇需要導(dǎo)入的資源默認(rèn)情況下,Unity會(huì)從資源包(一個(gè)資源的庫(kù)文件)中的所有文件解壓縮到當(dāng)前項(xiàng)目中。在導(dǎo)入操作結(jié)束后,各種各樣的大量資源和數(shù)據(jù)將會(huì)添加到項(xiàng)目中,以后可以隨時(shí)使用這些文件,它們都是原來(lái)文件的副本。所以,無(wú)論對(duì)項(xiàng)目中的哪個(gè)文件進(jìn)行更改,都不會(huì)影響到原來(lái)文件。這些文件包括各種模型、聲音、貼圖等。圖1.11所示為在Unity項(xiàng)目(Project)面板的編輯器中列出的這些文件。圖1.11從項(xiàng)目(Project)面板中對(duì)導(dǎo)入的資源進(jìn)行瀏覽當(dāng)在應(yīng)用菜單上依次選擇了“Assets|Import”之后,如果什么資源包都沒(méi)有,那么可以從Unity的主頁(yè)https://U/上下載和安裝這些資源包。打開(kāi)這個(gè)主頁(yè)之后,首先選擇“AdditionalDownloads”,然后在如圖1.12所示的頁(yè)面上選擇“StandardAssets”。圖1.12標(biāo)準(zhǔn)資源包(StandardAssets)的下載然而導(dǎo)入的資源并沒(méi)有存在于游戲之中,沒(méi)有出現(xiàn)在屏幕上,也不能做任何事情!它們只是被簡(jiǎn)單地添加到了項(xiàng)目(Project)面板,其實(shí)這些資源現(xiàn)在更像是一個(gè)庫(kù)或者說(shuō)是資源的倉(cāng)庫(kù),可以從其中進(jìn)行選擇來(lái)完成游戲的建立。到目前為止,這些資源已經(jīng)被內(nèi)置到了Unity之中,在之后的章節(jié)中將繼續(xù)使用它們,來(lái)完善金幣采集游戲的功能。如果想了解關(guān)于每個(gè)資源的詳細(xì)信息,可以使用鼠標(biāo)單擊選中這個(gè)資源,這時(shí)關(guān)于這個(gè)資源的詳細(xì)信息就會(huì)出現(xiàn)在Untiy編輯器右側(cè)的檢查(Inspector)面板中。檢查(Inspector)面板是一個(gè)位于開(kāi)發(fā)界面右側(cè)的屬性編輯器,它是上下文敏感的,并會(huì)自動(dòng)切換為顯示所選對(duì)象的屬性,如圖1.13所示。圖1.13檢查(Inspector)面板顯示了當(dāng)前選中物體的所有屬性1.4開(kāi)始一個(gè)關(guān)卡現(xiàn)在已經(jīng)創(chuàng)建了一個(gè)Unity的項(xiàng)目,并且利用Unity的標(biāo)準(zhǔn)資源包導(dǎo)入了一個(gè)很大的資源庫(kù),包括一些建筑類網(wǎng)格,例如墻、地板、天花板、樓梯等,將使用這些資源建立第一個(gè)關(guān)卡(level)。記住,在Unity中,一個(gè)場(chǎng)景(Scene)往往也就意味著一個(gè)關(guān)卡。場(chǎng)景和關(guān)卡這兩個(gè)詞匯在這里是沒(méi)有區(qū)別的,都是指一個(gè)三維空間,也就是游戲發(fā)生的時(shí)空。現(xiàn)在來(lái)創(chuàng)建一個(gè)金幣采集游戲的場(chǎng)景,首先從應(yīng)用程序菜單依次選擇“File|New”,或者也可以在鍵盤上按下“Ctrl+N”組合鍵。當(dāng)完成了這個(gè)操作之后,一個(gè)新的空白的場(chǎng)景就被創(chuàng)建好了??梢栽谡紦?jù)了Unity開(kāi)發(fā)界面最大部分的場(chǎng)景(Scene)選項(xiàng)卡中看到場(chǎng)景的預(yù)覽,如圖1.14所示。圖1.14場(chǎng)景(Scene)選項(xiàng)卡中給出了一個(gè)3D世界的預(yù)覽如圖1.14所示,在Unity中的場(chǎng)景(Scene)選項(xiàng)卡以外的其他選項(xiàng)卡也是可見(jiàn)的,并且可以使用的。這些選項(xiàng)卡包括游戲(Game)選項(xiàng)卡和動(dòng)畫(Animator)選項(xiàng)卡。有時(shí),選項(xiàng)卡的數(shù)目可能會(huì)更多。不過(guò)現(xiàn)在可以忽略除了場(chǎng)景以外的其他所有選項(xiàng)卡。場(chǎng)景(Scene)選項(xiàng)卡是為了能夠在游戲的開(kāi)發(fā)中簡(jiǎn)單快速地查看一個(gè)關(guān)卡。每一個(gè)新的場(chǎng)景都是空的,嚴(yán)格來(lái)說(shuō)幾乎是空的。默認(rèn)情況下,每一個(gè)新的場(chǎng)景都是由兩個(gè)對(duì)象開(kāi)始的,首先添加一個(gè)用來(lái)照亮其他任意對(duì)象的光源對(duì)象(Light),然后是一個(gè)用來(lái)從特定角度對(duì)場(chǎng)景中的內(nèi)容進(jìn)行顯示和渲染用的攝像機(jī)(Camera)??梢允褂瞄_(kāi)發(fā)界面(見(jiàn)圖1.15)左側(cè)的層次(Hierarchy)面板來(lái)查看所有在場(chǎng)景中對(duì)象的完整列表。這個(gè)面板上顯示了場(chǎng)景中所有對(duì)象的名稱。在Unity中,游戲?qū)ο蟮暮x就是在場(chǎng)景中存在的單一、獨(dú)立的東西,無(wú)論它們是可見(jiàn)的還是不可見(jiàn)的,例如網(wǎng)格、光源、攝像機(jī)、道具等。因此,只有從層次(Hierarchy)面板才能看到游戲場(chǎng)景中的一切。圖1.15層次(Hierarchy)面板也可以通過(guò)在層次(Hierarchy)面板中單擊游戲中對(duì)象的名稱來(lái)選中它們。接下來(lái)為這個(gè)場(chǎng)景添加一個(gè)地面(Floor)。要知道,游戲中的玩家總得站在一些東西上面??梢允褂玫谌降慕\浖ㄈ鏜aya、3DSMax或者Blender)來(lái)創(chuàng)建一個(gè)地面網(wǎng)格。不過(guò),在之前導(dǎo)入過(guò)的標(biāo)準(zhǔn)資源包中就含有可以使用的地面網(wǎng)格,這是相當(dāng)方便的。這些網(wǎng)格都是原型軟件包(PrototypingPackage)的一部分。如果想通過(guò)項(xiàng)目(Project)面板完成對(duì)這些資源的訪問(wèn),可以雙擊打開(kāi)“StandardAssets”文件夾,然后訪問(wèn)“Prototyping|Prefabs”文件夾。如圖1.16所示,可以看到這些對(duì)象,并從檢查(Inspector)面板中對(duì)它們進(jìn)行預(yù)覽。圖1.16包含了大量用于快速建立場(chǎng)景的網(wǎng)格的標(biāo)準(zhǔn)資源包/原型包你也可以在應(yīng)用程序菜單上依次選擇GameObject|3DObject|Plane,這樣可以更加方便地向場(chǎng)景(Scene)中添加地面(Floor)。不過(guò),加進(jìn)來(lái)的這個(gè)地面看起來(lái)一片灰暗,給人一種枯燥無(wú)味的感覺(jué)。當(dāng)然,這個(gè)地面的外觀是可改變的。正如我們?cè)诤竺婕磳⒖吹降囊粯?,Unity中允許對(duì)物體外觀進(jìn)行改變。不過(guò),在本書中,我們將從項(xiàng)目面板(Projectpanel)中的標(biāo)準(zhǔn)資源包里找到一個(gè)專門的地面網(wǎng)格(floormesh)來(lái)使用。圖1.16所示的名為“FloorPrototype64x01x64”的網(wǎng)格十分適合作為一個(gè)地面,現(xiàn)在只需要簡(jiǎn)單地將項(xiàng)目(Project)面板(Panel)中的對(duì)象拖曳到場(chǎng)景(Scene)視圖中,然后釋放鼠標(biāo)即可完成這個(gè)網(wǎng)格的添加工作,如圖1.17所示。當(dāng)在進(jìn)行這個(gè)操作時(shí)要注意,在三維空間中新添加了網(wǎng)格之后,場(chǎng)景(Scene)視圖中發(fā)生的變化,同時(shí)也要注意到這個(gè)網(wǎng)格的名稱也出現(xiàn)在了層次(Hierarchy)面板的列表中。圖1.17將網(wǎng)格資源從項(xiàng)目(Project)面板中拖動(dòng)到場(chǎng)景視圖中至此,現(xiàn)在項(xiàng)目(Project)面板上的網(wǎng)格資源已經(jīng)被實(shí)例化為一個(gè)場(chǎng)景中的物體。這意味著一個(gè)項(xiàng)目(Project)面板上的副本已經(jīng)作為一個(gè)獨(dú)立的游戲?qū)ο蠹尤氲搅藞?chǎng)景之中。地面的實(shí)例(或者對(duì)象)依附于項(xiàng)目(Project)面板中的“floor”資源。但是反過(guò)來(lái),這些資源卻并不依附這些實(shí)例。這意味著當(dāng)在場(chǎng)景中刪除這些實(shí)例(或者游戲?qū)ο螅r(shí),這些資源并不會(huì)被刪除。反之,當(dāng)刪除了這些資源時(shí),場(chǎng)景中的這些實(shí)例就會(huì)被刪除。如果場(chǎng)景中需要更多的地面,就可以多次從項(xiàng)目(Project)面板中向場(chǎng)景(Scene)視圖拖動(dòng)“floor”資源。每進(jìn)行一次這種操作,都會(huì)在場(chǎng)景中添加一個(gè)單獨(dú)的游戲物體。雖然這些游戲物體都依附于同一個(gè)“floor”資源,但是它們相互之間都是獨(dú)立的(見(jiàn)圖1.18)。圖1.18向場(chǎng)景中添加多個(gè)“floor”網(wǎng)格實(shí)際上,并不需要這么多重復(fù)的地面,所以先把它們刪除。刪除這些地面的方法是先在場(chǎng)景(Scene)視圖中逐個(gè)單擊這些“floor”對(duì)象,然后在鍵盤上按下刪除鍵。另外記住,也可以通過(guò)單擊層次(Hierarchy)面板上這些游戲物體的名字,然后按下刪除鍵。不管使用的是哪一種方法,如今在場(chǎng)景中都只剩下了唯一一個(gè)“floor”對(duì)象?,F(xiàn)在還有一個(gè)問(wèn)題,那就是這個(gè)“floor”對(duì)象的名字問(wèn)題。在層次(Hierarchy)面板上可以清楚地看到這個(gè)“floor”對(duì)象的名字是“FloorPrototype64x01x64”,這個(gè)名字很長(zhǎng),意義又不夠明確,而且調(diào)用的時(shí)候又不方便。因此應(yīng)該將這個(gè)名字改為一個(gè)更容易管理的,而且意義更明確的,這樣才能使工作更加有條理,也更容易管理。Unity中有很多種可以將對(duì)象重命名的方法,首先選中對(duì)象,然后在其檢查(Inspector)面板中的名稱字段處輸入新的名字。這里將這個(gè)對(duì)象重命名為“WorldFloor”,如圖1.19所示。圖1.19對(duì)“floor”網(wǎng)格進(jìn)行重命名1.5變換和導(dǎo)航到現(xiàn)在為止,一個(gè)地面網(wǎng)格已經(jīng)建立好了,但是僅僅這一個(gè)游戲?qū)ο筮€是很無(wú)趣的,還需要向其中添加更多的內(nèi)容,例如建筑物、樓梯、柱子或者更多的地面。否則,玩家在這個(gè)游戲中就沒(méi)有能進(jìn)行探索的世界了。在開(kāi)始創(chuàng)建之前,首先要先確認(rèn)現(xiàn)在的地面處在了整個(gè)世界的中心位置。場(chǎng)景中的任何一個(gè)位置都有一個(gè)唯一的坐標(biāo),這個(gè)坐標(biāo)(x,y,z)值指的是距離世界中心點(diǎn)(原點(diǎn))的距離。在檢查(Inspector)面板中可以看到當(dāng)前選中對(duì)象的坐標(biāo)。事實(shí)上,在Unity中,一個(gè)對(duì)象的位置(Position)、角度(Rotation)和尺寸(Scale)同屬于一個(gè)名為變換(Transform)的類別。位置表示的是一個(gè)對(duì)象距離3個(gè)坐標(biāo)軸的距離。角度表示一個(gè)對(duì)象繞著它的中心軸旋轉(zhuǎn)的角度。尺寸表示一個(gè)對(duì)象應(yīng)該縮小到多小或者擴(kuò)大到多大。默認(rèn)的尺寸指的就是對(duì)象正常的大小,尺寸為2表示擴(kuò)大到原來(lái)兩倍的大小,尺寸為0.5表示縮小到原來(lái)的一半,以此類推。這樣,一個(gè)對(duì)象的位置、角度、尺寸共同構(gòu)成了它的變換屬性。如果想改變一個(gè)選定對(duì)象的位置,可以在x、y和z位置字段輸入新的值。例如將一個(gè)對(duì)象移動(dòng)到游戲世界的中心,就可以輸入(0,0,0),如圖1.20所示。圖1.20將一個(gè)對(duì)象移動(dòng)到游戲世界的中心點(diǎn)如上所示,通過(guò)輸入適當(dāng)?shù)闹?,?dāng)然這個(gè)值要在系統(tǒng)許可的范圍內(nèi),就可以為對(duì)象指定準(zhǔn)確的位置。不過(guò),使用鼠標(biāo)來(lái)直接移動(dòng)對(duì)象往往更為直觀?,F(xiàn)在就來(lái)完成這個(gè)操作,首先添加第二個(gè)floor對(duì)象,這個(gè)floor對(duì)象的位置要遠(yuǎn)離第一個(gè)floor對(duì)象。先從項(xiàng)目(Project)面板上拖曳一個(gè)floor對(duì)象到場(chǎng)景中,然后單擊這個(gè)新的floor場(chǎng)景以選中它,然后按下鍵盤上的“W”鍵,或者單擊編輯器界面頂端的變換工具圖標(biāo)來(lái)切換到變換工具。變換工具允許對(duì)場(chǎng)景中的對(duì)象進(jìn)行重新定位,如圖1.21所示。圖1.21打開(kāi)變換工具當(dāng)選定一個(gè)游戲?qū)ο?,并且打開(kāi)變換工具以后,一個(gè)標(biāo)識(shí)(Gizmo)就出現(xiàn)在游戲?qū)ο蟮闹行牟糠?,在?chǎng)景(Scene)選項(xiàng)卡中可以看到標(biāo)識(shí)(Gizmo)其實(shí)是由3個(gè)不同顏色的彩色軸組成的。其中,紅顏色的軸代表x軸,綠顏色的軸代表y軸,藍(lán)顏色的軸代表z軸。如果想移動(dòng)一個(gè)游戲?qū)ο?,首先要將光?biāo)懸停在這3個(gè)軸中的一個(gè)軸(或者兩個(gè)軸之間的平面)上面,然后單擊并按住鼠標(biāo),同時(shí)向目標(biāo)方向拖動(dòng)。可以反復(fù)地進(jìn)行這個(gè)操作,將游戲?qū)ο笠苿?dòng)到指定的位置。現(xiàn)在就用這個(gè)方法來(lái)拖動(dòng)第二個(gè)floor對(duì)象,使其遠(yuǎn)離第一個(gè)floor對(duì)象,如圖1.22所示。圖1.22使用標(biāo)識(shí)(Gizmo)來(lái)完成對(duì)一個(gè)游戲?qū)ο蟮淖儞Q操作也可以使用鼠標(biāo)來(lái)完成對(duì)游戲?qū)ο蟮霓D(zhuǎn)動(dòng)和縮放。在鍵盤上按下“E”鍵可以啟動(dòng)旋轉(zhuǎn)工具,按下“R”鍵可以啟動(dòng)縮放工具,或者也可以在編輯器界面的上方單擊它們對(duì)應(yīng)的工具欄圖標(biāo)來(lái)啟動(dòng)這些工具。當(dāng)工具啟動(dòng)之后,一個(gè)標(biāo)識(shí)(Gizmo)就出現(xiàn)在這個(gè)對(duì)象的中心部分,可以通過(guò)單擊和拖動(dòng)鼠標(biāo)來(lái)將這個(gè)對(duì)象旋轉(zhuǎn)到指定角度,或者縮放到指定尺寸,如圖1.23所示。圖1.23旋轉(zhuǎn)和縮放工具的選擇在Unity中進(jìn)行開(kāi)發(fā)時(shí),使用鍵盤和鼠標(biāo)對(duì)物體進(jìn)行快速的移動(dòng)、旋轉(zhuǎn)和縮放是非常重要的。所以,最好習(xí)慣使用鍵盤的快捷鍵來(lái)完成這些操作,而不是總用鼠標(biāo)去單擊工具欄。不過(guò),除了要對(duì)游戲?qū)ο筮M(jìn)行移動(dòng)、旋轉(zhuǎn)和縮放以外,可能還需要頻繁地變換自己的視角,這樣才能從不同的位置、角度和視角對(duì)這個(gè)世界進(jìn)行觀察。這意味著必須要經(jīng)常改變場(chǎng)景中的攝像機(jī)。當(dāng)要看清楚一個(gè)游戲?qū)ο髸r(shí),就會(huì)需要進(jìn)行放大或縮小的操作。如果想準(zhǔn)確地將游戲?qū)ο髮?duì)齊并結(jié)合在一起,就需要改變觀察的視角。如果想完成這些操作,就需要充分地將鼠標(biāo)和鍵盤結(jié)合在一起使用。如果想靠近或者遠(yuǎn)離正在觀察的對(duì)象,只需要向上或者向下滑動(dòng)鼠標(biāo)滾輪,就可以實(shí)現(xiàn)放大或者縮小目標(biāo)對(duì)象,過(guò)程如圖1.24所示。圖1.24放大或者縮小操作按住鼠標(biāo)的中鍵然后將鼠標(biāo)向適當(dāng)?shù)姆较蛞苿?dòng),如向上移動(dòng),這樣就可以將場(chǎng)景(Scene)視圖向上移動(dòng)。同樣,向另外3個(gè)方向移動(dòng)鼠標(biāo)也可以將場(chǎng)景(Scene)視圖向這3個(gè)方向移動(dòng)。或者也可以在應(yīng)用工具欄中(或者使用鍵盤上的Q快捷鍵)激活移動(dòng)工具,如圖1.25所示。當(dāng)這個(gè)移動(dòng)工具處于激活狀態(tài)的時(shí)候,就可以十分簡(jiǎn)單地單擊并拖動(dòng)整個(gè)場(chǎng)景(Scene)視圖。注意,這個(gè)操作并不會(huì)改變場(chǎng)景的大小,而只是沿著向左、向右或者向上、向下的方向滑動(dòng)攝像機(jī)。圖1.25激活移動(dòng)工具有時(shí)在構(gòu)建關(guān)卡時(shí),可能會(huì)找不到所需要的對(duì)象。例如,此時(shí)攝像機(jī)可能正在關(guān)注一個(gè)與目標(biāo)完全不同的地方,這個(gè)地方并不是所要單擊或者看到的。如果遇到了這種情況,必須要改變相機(jī)的視角來(lái)找到目標(biāo)對(duì)象。如果將這個(gè)目標(biāo)對(duì)象處在整個(gè)場(chǎng)景的中心,就必須不斷地進(jìn)行改變位置和旋轉(zhuǎn)視圖的操作。但是如果要自動(dòng)地完成這一切,可以有一種更簡(jiǎn)單的方法,那就是從層次(Hierarchy)面板上選中這個(gè)對(duì)象的名字。然后,按下鍵盤上的“F”鍵,也可以直接在層次(Hierarchy)面板上直接雙擊來(lái)完成這個(gè)操作,如圖1.26所示。圖1.26一個(gè)選定的對(duì)象當(dāng)選中了一個(gè)游戲?qū)ο笾?,可能?huì)經(jīng)常性地對(duì)這些對(duì)象進(jìn)行旋轉(zhuǎn)操作,以便能從所有的重要視角來(lái)對(duì)其進(jìn)行查看,只需要單擊鼠標(biāo),并在拖動(dòng)的同時(shí)按住鍵盤上的“Alt”鍵,就可以完成視角的轉(zhuǎn)動(dòng),如圖1.27所示。圖1.27繞著一個(gè)選中的游戲?qū)ο筮M(jìn)行旋轉(zhuǎn)最后,在場(chǎng)景(Scene)視圖中使用第一人稱視角控制是十分實(shí)用的,像在玩一款第一人稱視角的游戲一樣,這將有助于你以一種身臨其境的方式來(lái)體驗(yàn)整個(gè)現(xiàn)場(chǎng)。如果想實(shí)現(xiàn)這個(gè)功能,可以在按下鼠標(biāo)右鍵的同時(shí)使用鍵盤上的“W”“A”“S”“D”來(lái)控制前進(jìn)、后退或者左右轉(zhuǎn)動(dòng)。使用鼠標(biāo)來(lái)控制頭的方向。另外,還可以在運(yùn)動(dòng)的同時(shí)按下“Shift”鍵來(lái)提高運(yùn)動(dòng)的速度,如圖1.28所示。圖1.28使用第一人稱視角控制這里之所以選擇對(duì)各種進(jìn)行變換和導(dǎo)航控制的方法進(jìn)行學(xué)習(xí),就在于掌握了這些知識(shí)之后,你就可以以任何方式來(lái)定位和移動(dòng)目標(biāo)對(duì)象,也可以從任何的位置和角度來(lái)查看整個(gè)世界。如果想快速地建立一個(gè)高品質(zhì)的游戲關(guān)卡,做到這一點(diǎn)是十分重要的。所有的這些以及一些其他的控制方式都將貫穿于這本書的場(chǎng)景創(chuàng)建和Unity開(kāi)發(fā)之中。1.6場(chǎng)景的建立現(xiàn)在已經(jīng)成功地實(shí)現(xiàn)了對(duì)象的屬性變換和在場(chǎng)景視圖中的導(dǎo)航。接下來(lái)可以開(kāi)始完成金幣采集游戲的第一個(gè)關(guān)卡了。首先將空間中的兩個(gè)floor網(wǎng)格對(duì)象分開(kāi),在它們之間留一個(gè)大的裂縫,將來(lái)會(huì)在這個(gè)裂縫上創(chuàng)建一個(gè)橋梁。玩家將可以通過(guò)這個(gè)橋梁往返于兩個(gè)如同島嶼一樣的floor網(wǎng)格對(duì)象之間??梢允褂米儞Q(Translate)工具(W)來(lái)移動(dòng)物體,如圖1.29所示。圖1.29將兩個(gè)floor網(wǎng)格對(duì)象分隔成獨(dú)立的島嶼如果創(chuàng)建更多的floor對(duì)象,可以使用之前用過(guò)的方法,從項(xiàng)目(Project)面板處拖動(dòng)一個(gè)網(wǎng)格資源到場(chǎng)景視圖中。另外,也可以將在場(chǎng)景視圖中選中的對(duì)象進(jìn)行復(fù)制,復(fù)制的方法是在選中目標(biāo)對(duì)象之后,同時(shí)按下鍵盤上的“Ctrl+D”組合鍵,這兩種方法都可以達(dá)到目的。接下來(lái),要向場(chǎng)景中添加一些道具(Props)和障礙物(Obstacles),首先向floor網(wǎng)格對(duì)象上添加一些房屋(House)對(duì)象,可以按照“Assets|StandardAssets|Prototyping|Prefabs”這個(gè)目錄找到房屋對(duì)象(HousePrototype16x16x24),如圖1.30所示。圖1.30向場(chǎng)景中添加房屋道具當(dāng)將一個(gè)房屋拖動(dòng)到場(chǎng)景中之后,這個(gè)房屋可能會(huì)與地面的底部完美的對(duì)齊,但是也有可能不會(huì),如果對(duì)齊了,那你的運(yùn)氣還真是不錯(cuò)。但是我們不可能每次都有這么好的運(yùn)氣,一個(gè)專業(yè)的游戲開(kāi)發(fā)者應(yīng)該依靠自身的技能,而不是運(yùn)氣。不過(guò)別擔(dān)心,在Unity中,可以輕松地使用頂點(diǎn)捕捉(VertexSnapping)來(lái)將任意的兩個(gè)網(wǎng)格對(duì)象進(jìn)行對(duì)齊。這個(gè)功能的工作原理是使兩個(gè)游戲中的對(duì)象通過(guò)將它們的頂點(diǎn)定位到同一個(gè)位置來(lái)實(shí)現(xiàn)對(duì)齊操作。這里以圖1.31為例,在這張圖中房子歪歪扭扭地坐落在floor對(duì)象之上,我們很自然地希望將它和floor對(duì)象進(jìn)行水平對(duì)齊或者角對(duì)齊。要實(shí)現(xiàn)這個(gè)效果,我們首先要選擇房子(House)對(duì)象,這一點(diǎn)可以通過(guò)單擊或者在層次面板中選擇這個(gè)對(duì)象來(lái)完成,要注意進(jìn)行選中操作的應(yīng)該是要移動(dòng)的那個(gè)對(duì)象,而不是那個(gè)用來(lái)對(duì)齊的參照物(此處特指floor對(duì)象)。圖1.31使用頂點(diǎn)捕捉(VertexSnapping)來(lái)對(duì)沒(méi)有對(duì)齊的物體進(jìn)行調(diào)整接下來(lái),激活變換工具(W),并且按下鍵盤上的“V”鍵,同時(shí)移動(dòng)光標(biāo),觀察選中網(wǎng)格中最近頂點(diǎn)的標(biāo)識(shí)(Gizmo)光標(biāo),如圖1.32所示。Unity會(huì)要求選擇一個(gè)進(jìn)行捕捉操作的源頂點(diǎn)。圖1.32按下“V”鍵來(lái)激活頂點(diǎn)捕捉(VertexSnapping)按下鍵盤上的“V”鍵,同時(shí)把光標(biāo)移動(dòng)到房屋底部角的位置,然后單擊并從角拖動(dòng)到floor網(wǎng)格的角。然后房屋將會(huì)完成與floor網(wǎng)格角對(duì)角的頂點(diǎn)捕捉對(duì)齊,當(dāng)完成了這種對(duì)齊之后,釋放“V”鍵,此時(shí)兩個(gè)網(wǎng)格的頂點(diǎn)已經(jīng)對(duì)齊了,如圖1.33所示。圖1.33通過(guò)頂點(diǎn)對(duì)齊兩個(gè)網(wǎng)格現(xiàn)在,可以使用原型包(PrototypingPackage)中的網(wǎng)格資源來(lái)搭建一個(gè)完整的場(chǎng)景了。通過(guò)向場(chǎng)景中拖放一些道具,并使用變換、旋轉(zhuǎn)以及縮放操作,就可以實(shí)現(xiàn)對(duì)這些游戲?qū)ο蟮亩ㄎ?、排放和轉(zhuǎn)動(dòng)。使用頂點(diǎn)捕捉,可以按自己所愿將所有游戲?qū)ο筮M(jìn)行對(duì)齊。多練習(xí)一些這種操作,使用這些工具和資源可以完成圖1.34所示的場(chǎng)景安排。圖1.34構(gòu)建一個(gè)完整的關(guān)卡1.7光源和天空現(xiàn)在已經(jīng)完成關(guān)卡中基本建筑的模型導(dǎo)入和布局?jǐn)[放了,只使用很少的幾個(gè)網(wǎng)格資源和一些基本工具就完成了這些操作。不過(guò),這些工具的功能卻是相當(dāng)強(qiáng)大的,將這些工具組合操作,可以讓游戲世界變得豐富多彩,甚至以假亂真。不過(guò),這里還遺漏了一點(diǎn)很重要的事情,那就是光。仔細(xì)觀察圖1.34,這里所有的物體看起來(lái)都是單調(diào)的,沒(méi)有光亮、陰影。這是因?yàn)閳?chǎng)景中并沒(méi)有配置合適的照明系統(tǒng),雖然在游戲創(chuàng)建的時(shí)候已經(jīng)默認(rèn)自帶了一個(gè)光源對(duì)象(Light),但是這個(gè)光源對(duì)象(Light)現(xiàn)在并沒(méi)有起什么作用?,F(xiàn)在這個(gè)場(chǎng)景中還沒(méi)有天空,接下來(lái)就為這個(gè)金幣采集游戲添加上一個(gè)天空(Sky)效果,單擊場(chǎng)景(Scene)視圖頂部工具欄的下拉菜單,然后從下拉菜單中選中“skybox”以啟用天空效果。這里的天空盒(Skybox)指的就是一個(gè)包圍了整個(gè)場(chǎng)景的大型立方體,這個(gè)立方體的每個(gè)內(nèi)部的側(cè)面都有一個(gè)貼圖(圖像),這些貼圖連續(xù)在一起,看起來(lái)就如同現(xiàn)實(shí)中的天空一樣。這里選用了“skybox”,就在場(chǎng)景(Scene)視圖中顯示了一個(gè)如圖1.35所示的默認(rèn)的天空。圖1.35啟用天空效果雖然天空效果的啟用使得整個(gè)場(chǎng)景看起來(lái)好多了,但是它卻仍然缺乏一個(gè)合適的照明系統(tǒng)。場(chǎng)景中的游戲?qū)ο笕狈饬梁完幱埃瑸榱烁纳七@一點(diǎn),首先要打開(kāi)場(chǎng)景(Scene)視圖上方(見(jiàn)圖1.36)的照明圖標(biāo)開(kāi)關(guān),確保照明系統(tǒng)是啟用的。注意,這個(gè)開(kāi)關(guān)只是決定照明系統(tǒng)是否在場(chǎng)景(Scene)視圖中起作用,而決定不了在最后的游戲中照明系統(tǒng)是否起作用。圖1.36在場(chǎng)景(Scene)視圖中啟用場(chǎng)景照明系統(tǒng)啟用了照明系統(tǒng)之后,就會(huì)明顯地看到場(chǎng)景與之前有了很大的差異,現(xiàn)在的場(chǎng)景看起來(lái)真實(shí)多了。也可以選擇層次(Hierarchy)面板上的“DirectionalLight”來(lái)進(jìn)行旋轉(zhuǎn)操作,以確定場(chǎng)景中的燈光效果。眾所周知,一天中的不同時(shí)間里,光線的強(qiáng)度和角度都是不同的,現(xiàn)在就可以利用這種操作來(lái)實(shí)現(xiàn)不同時(shí)間中光線的變化。這樣將會(huì)改變場(chǎng)景的渲染方式,如圖1.37所示。圖1.37轉(zhuǎn)動(dòng)場(chǎng)景中的方向光(DirectionalLight)模擬一天中時(shí)間的變化如果要撤銷之前對(duì)方向光(DirectionalLight)做的任何操作,可以按下鍵盤上的“Ctrl+Z”組合鍵。為了做好最終及最佳的照明效果,需要把場(chǎng)景中所有不能移動(dòng)的游戲?qū)ο螅ɡ鐗Ρ?、地板、桌子、椅子、天花板、草、山、塔等)都?biāo)記為靜態(tài)的。對(duì)于Unity來(lái)說(shuō),意味著標(biāo)記為靜態(tài)的游戲?qū)ο笤谡麄€(gè)的游戲過(guò)程中,無(wú)論發(fā)生什么,都是永遠(yuǎn)不會(huì)被移動(dòng)的。通過(guò)將游戲?qū)ο髽?biāo)記為靜態(tài),就可以幫助Unity在對(duì)游戲渲染和照明處理時(shí)進(jìn)行優(yōu)化。現(xiàn)在只需要在場(chǎng)景中選擇所有不能移動(dòng)的對(duì)象(這包括了目前為止游戲中的所有對(duì)象),然后在對(duì)象的檢查(Inspector)面板中選中靜態(tài)(Static)復(fù)選框。注意,無(wú)需分別地設(shè)置靜態(tài)屬性。在為多個(gè)對(duì)象設(shè)置靜態(tài)屬性時(shí),只需要在選擇這些對(duì)象的,同時(shí)按下Shift鍵就能選中所有對(duì)象,然后就可以一次性地在對(duì)象的檢查(Inspector)面板中為這些對(duì)象設(shè)置屬性,如圖1.38所示。圖1.38為多個(gè)不能移動(dòng)的對(duì)象設(shè)置靜態(tài)選項(xiàng)以改善照明和系統(tǒng)性能當(dāng)為一個(gè)幾何圖形的游戲?qū)ο蠊催x了靜態(tài)(Static)復(fù)選框之后,Unity將會(huì)自動(dòng)為場(chǎng)景中的光線效果進(jìn)行計(jì)算,這些效果包括陰影、間接照明等。通過(guò)計(jì)算得到了一些被稱為“GI緩存”的數(shù)據(jù),這些數(shù)據(jù)中包含了光的傳播路線,向Unity指示了光線應(yīng)該如何在場(chǎng)景中進(jìn)行傳播和反射,才能更真實(shí)地模擬現(xiàn)實(shí)世界。即便如此,之前勾選了靜態(tài)復(fù)選框的游戲?qū)ο筮€是沒(méi)有陰影,這將使游戲看起來(lái)很不真實(shí)。產(chǎn)生這種情況的原因是大部分的網(wǎng)格對(duì)象都有一個(gè)產(chǎn)生陰影(CastShadows)的選項(xiàng),而這個(gè)選項(xiàng)默認(rèn)是禁用的。現(xiàn)在來(lái)消除這個(gè)缺陷,首先選中場(chǎng)景中的所有網(wǎng)格對(duì)象,然后在檢查(Inspector)面板上單擊“MeshRenderer”組件并選中“CastShadows”復(fù)選框,當(dāng)完成這個(gè)操作后,所有的網(wǎng)格對(duì)象就有如圖1.39所示的陰影效果了。圖1.39從“MeshRenderer”組件上啟用陰影效果現(xiàn)在的網(wǎng)格對(duì)象都已經(jīng)產(chǎn)生了陰影,下面就此開(kāi)發(fā)過(guò)程做個(gè)小結(jié)。到目前為止,已經(jīng)創(chuàng)建了一個(gè)新的Unity項(xiàng)目,使用網(wǎng)格對(duì)象填充了整個(gè)游戲場(chǎng)景,而且使用方向光(DirectionalLight)成功地完成了對(duì)場(chǎng)景的照明。如果使用第一人稱視角模式在這個(gè)游戲環(huán)境中進(jìn)行一番游歷,那將會(huì)是非常棒的體驗(yàn)。好了,我們來(lái)看看接下來(lái)的操作吧!1.8游戲測(cè)試與游戲選項(xiàng)卡至此,已經(jīng)使用Unity自帶原型包(PrototypingPackage)完成了金幣采集游戲環(huán)境的構(gòu)建。現(xiàn)在的游戲環(huán)境包含了兩個(gè)主要的島嶼,島嶼上有一些建筑物,兩個(gè)獨(dú)立的島嶼通過(guò)一個(gè)石橋連接在一起,如圖1.40所示。可能你的布局與圖1.40看起來(lái)有一些不同,不過(guò)也是非常不錯(cuò)的。圖1.40目前已經(jīng)包含了兩個(gè)島嶼區(qū)域的場(chǎng)景總的來(lái)看,場(chǎng)景還是完成得不錯(cuò),現(xiàn)在需要把這個(gè)場(chǎng)景保存一下??梢赃x擇按下鍵盤上的“Ctrl+S”組合鍵,或者也可以如圖1.41所示,從應(yīng)用程序菜單上選擇“File|SaveScene”選項(xiàng)。如果是第一次對(duì)場(chǎng)景進(jìn)行保存,Unity會(huì)彈出一個(gè)“Save”對(duì)話框,提示為這個(gè)場(chǎng)景起一個(gè)名字(這里本書將這個(gè)場(chǎng)景起名為“l(fā)evel__01”)。圖1.41對(duì)場(chǎng)景進(jìn)行保存完成這個(gè)場(chǎng)景的保存之后,它就成為了當(dāng)前項(xiàng)目的場(chǎng)景資源,同時(shí)也如圖1.42一樣出現(xiàn)在了項(xiàng)目(Project)面板中。這意味著當(dāng)前的場(chǎng)景已經(jīng)不再像以前是一個(gè)臨時(shí)拼湊在一起的組合了,而是一個(gè)真正不可分割的整體。注意,對(duì)一個(gè)場(chǎng)景進(jìn)行保存與對(duì)一個(gè)項(xiàng)目進(jìn)行保存并不一樣,比如在應(yīng)用程序菜單上就分別有“SaveScene”和“SaveProject”兩個(gè)不同的選項(xiàng)。記住,一個(gè)項(xiàng)目是一些文件和文件夾的集合,它包含了游戲中的場(chǎng)景和資源。相比之下,一個(gè)場(chǎng)景是項(xiàng)目中的一個(gè)資源,外觀就像是一個(gè)完整的3D地圖。這個(gè)場(chǎng)景中包含了很多網(wǎng)格、紋理和聲音。因此,保存一個(gè)項(xiàng)目是指將包括場(chǎng)景在其中的各種文件和資源的配置進(jìn)行保存。而對(duì)場(chǎng)景的保存,只是將指定場(chǎng)景中關(guān)卡的變化進(jìn)行保存。圖1.42保存的scenes被作為資源添加到項(xiàng)目中從圖1.42可以看出,已經(jīng)將場(chǎng)景保存到了一個(gè)名為“scenes”的文件夾中??梢栽陧?xiàng)目(Project)面板上的任意空白區(qū)域單擊鼠標(biāo)右鍵來(lái)為自己的項(xiàng)目創(chuàng)建一個(gè)文件夾。另外,依次單擊應(yīng)用程序菜單上的“Assets|Create|Folder”,就可以輕易地使用鼠標(biāo)拖放來(lái)完成對(duì)文件夾中的資源進(jìn)行移動(dòng)操作?,F(xiàn)在的這個(gè)關(guān)卡中并沒(méi)有任何可以玩的東西。它只是一個(gè)使用編輯器開(kāi)發(fā)出來(lái)的靜止的、了無(wú)生趣的且與外界毫無(wú)交互行為的三維環(huán)境?,F(xiàn)在給游戲添加可玩性,允許玩家通過(guò)控制鍵盤上的“W”“A”“S”“D”以第一人稱視角的方式在這個(gè)游戲世界中進(jìn)行環(huán)游和探索。為了實(shí)現(xiàn)這個(gè)目標(biāo),需要向場(chǎng)景中添加一個(gè)第一人稱視角角色控制器(First-personCharacterController),它是Unity中自帶的資源,本身已經(jīng)包含了實(shí)現(xiàn)第一人稱視角角色控制的所有功能。依次打開(kāi)“StandardAssets|Characters|FirstPersonCharacter|Prefabs”文件夾,然后從項(xiàng)目(Project)面板拖動(dòng)“FPSController”資源到場(chǎng)景中,如圖1.43所示。圖1.43向場(chǎng)景中添加第一人稱視角角色控制器當(dāng)添加了第一人稱視角角色控制器以后,就可以單擊Unity工具欄上的“Play”按鈕以第一人稱視角模式來(lái)進(jìn)行游戲,如圖1.44所示。圖1.44單擊工具欄上的“Play”按鈕對(duì)Unity中的場(chǎng)景進(jìn)行測(cè)試按下“Play”按鈕之后,Unity就可以從場(chǎng)景(Scene)選項(xiàng)卡切換到游戲(Game)選項(xiàng)卡,正如所看到的,場(chǎng)景(Scene)選項(xiàng)卡是以一個(gè)開(kāi)發(fā)者的視角來(lái)觀看整個(gè)場(chǎng)景的,此時(shí)可以對(duì)場(chǎng)景進(jìn)行編輯、制作和設(shè)計(jì)。相比之下,游戲(Game)選項(xiàng)卡是以一個(gè)游戲者的視角來(lái)查看整個(gè)場(chǎng)景的,只能進(jìn)行游戲和測(cè)試。在游戲者的視角中,只能從主攝像機(jī)的角度來(lái)查看所有的場(chǎng)景。當(dāng)激活了游戲(Game)選項(xiàng)卡,并啟動(dòng)“Play”模式后,可以使用游戲默認(rèn)的控制方式開(kāi)始這個(gè)游戲的測(cè)試工作。第一人稱視角控制器使用鍵盤上的“W”“A”“S”“D”4個(gè)鍵來(lái)控制運(yùn)動(dòng),使用鼠標(biāo)來(lái)控制視角,如圖1.45所示。圖1.45在游戲(Game)選項(xiàng)卡中完成對(duì)關(guān)卡的測(cè)試即使處于“Play”模式中,也可以隨時(shí)切換到場(chǎng)景(Scene)選項(xiàng)卡中,甚至可以對(duì)場(chǎng)景進(jìn)行編輯和修改,對(duì)場(chǎng)景中的對(duì)象進(jìn)行移動(dòng)和刪除。但是要注意的是,所有,在“Play”模式期間進(jìn)行的改動(dòng),在“Play”模式結(jié)束之后都會(huì)自動(dòng)復(fù)原,也就是這些改動(dòng)都不會(huì)被保留。這是一種特意的設(shè)計(jì),它允許在游戲過(guò)程中對(duì)屬性進(jìn)行編輯,從而可以觀察產(chǎn)生的影響,并對(duì)問(wèn)題進(jìn)行調(diào)試,但是卻并不真正地對(duì)場(chǎng)景進(jìn)行改動(dòng)?,F(xiàn)在的關(guān)卡中已經(jīng)可以實(shí)現(xiàn)以第一人稱視角模式行走了。當(dāng)結(jié)束游戲時(shí),可以再一次單擊“Play”按鈕,或者按下鍵盤上的“Ctrl+P”組合鍵,之后就返回到場(chǎng)景(Scene)選項(xiàng)卡中了。Unity中還提供了用來(lái)暫停和恢復(fù)游戲的“Toggle-Pause”按鈕。到現(xiàn)在為止,你應(yīng)該已經(jīng)注意到了,當(dāng)在關(guān)卡中以第一人稱視角控制器進(jìn)行游戲的時(shí)候,在下面的控制臺(tái)(Console)窗口中不斷地輸出一些信息。默認(rèn)情況下,這個(gè)窗口位于Unity編輯器的下方,就在項(xiàng)目(Project)面板旁邊,也可以通過(guò)在菜單欄上依次選中“Window|Console”人為地打開(kāi)這個(gè)窗口??刂婆_(tái)(Console)窗口會(huì)將所有遇到的錯(cuò)誤或者警告以消息的形式顯示出來(lái)。錯(cuò)誤都會(huì)以紅顏色標(biāo)記,警告都會(huì)以黃顏色進(jìn)行標(biāo)記,而普通的信息則會(huì)以默認(rèn)的灰色顯示。有時(shí),一條消息只會(huì)顯示一次,而有時(shí)卻會(huì)顯示很多次,如圖1.46所示。圖1.46控制臺(tái)(Console)窗口輸出信息、警告和錯(cuò)誤正如之前提到過(guò)的,在控制臺(tái)(Console)窗口中可以輸出3種不同類型的消息:信息、警告和錯(cuò)誤。信息是指基于當(dāng)前工作的項(xiàng)目給出的最佳建議和意見(jiàn)。警告是指在代碼或者場(chǎng)景中出現(xiàn)了一些不太嚴(yán)重的問(wèn)題,如果不改正,則可能會(huì)導(dǎo)致游戲中出現(xiàn)意想不到的行為以及不佳的游戲性能。錯(cuò)誤消息描述了需要立即引起注意的代碼和場(chǎng)景中的錯(cuò)誤。有時(shí),這些錯(cuò)誤導(dǎo)致游戲根本無(wú)法工作,或者在運(yùn)行的時(shí)候發(fā)生錯(cuò)誤,從而引起游戲崩潰或者失去響應(yīng)。此時(shí)控制臺(tái)(Console)窗口就顯得十分有用了,因?yàn)樗梢詫?shí)現(xiàn)對(duì)游戲進(jìn)行調(diào)試。圖1.46中就給出了一個(gè)關(guān)于“AudioListener”重復(fù)的問(wèn)題?!癆udioListener”是一個(gè)連接到攝像機(jī)對(duì)象的組件。默認(rèn)情況下,每一個(gè)攝像機(jī)都有一個(gè)“AudioListener”組件,它像是一個(gè)耳朵,在攝像機(jī)所在的位置接收?qǐng)鼍爸械母鞣N聲音。但是,Unity中并不支持在同一場(chǎng)景中使用多個(gè)處于激活狀態(tài)的“AudioListener”。這也就意味著在同一地點(diǎn)同一時(shí)間只能聽(tīng)到一個(gè)聲音。那么問(wèn)題就產(chǎn)生了,因?yàn)楝F(xiàn)在的場(chǎng)景中已經(jīng)包含了兩個(gè)攝像機(jī),其中一個(gè)是在創(chuàng)建場(chǎng)景時(shí)自動(dòng)產(chǎn)生的,另外一個(gè)是添加的第一人稱視角控制器中自帶的。若想確認(rèn)這一點(diǎn),只需要在層次(Hierarchy)面板上選中第一人稱視角控制器對(duì)象,之后單擊它名字旁邊的三角形圖標(biāo),這樣就會(huì)在這個(gè)物體的下方顯示更多的對(duì)象,這些對(duì)象都是第一人稱視角控制器的組成部分,如圖1.47所示。圖1.47找到第一人稱視角控制器中的攝像機(jī)選中位于“FPSController”下方展開(kāi)之后顯示的“FirstPersonCharacter”對(duì)象,如圖1.47所示?!癋irstPersonCharacter”對(duì)象是“FPSController”對(duì)象的一個(gè)子對(duì)象。這一點(diǎn)從層次(Hierarchy)面板上的“FPSController”中包含了“FirstPersonCharacter”就可以看出來(lái)。子對(duì)象會(huì)繼承它們上一級(jí)對(duì)象的變換(Transformation)屬性。這表示當(dāng)在場(chǎng)景中對(duì)某些對(duì)象進(jìn)行移動(dòng)或者旋轉(zhuǎn)操作時(shí),所做的變換同樣會(huì)影響到它的所有子對(duì)象。在檢查(Inspector)面板中,可以看到這個(gè)對(duì)象包含一個(gè)“AudioListener”組件,如圖1.48所示。圖1.48包含了“AudioListener”組件的第一人稱視角控制器游戲?qū)ο笠部梢赃x擇將“AudioListener”組件從FPSController對(duì)象上移除,但是這樣做,游戲者在以第一人稱視角進(jìn)行游戲時(shí)就再也聽(tīng)不到聲音了。所以,選擇將場(chǎng)景創(chuàng)建之初自帶的攝像機(jī)刪除。只需要在層次(Hierarchy)面板上選中圖1.49所示的攝像機(jī),然后按下鍵盤上的“Delete”鍵即可完成刪除操作。這樣就可以消除在游戲進(jìn)行時(shí)產(chǎn)生的關(guān)于“AudioListener”的警告。現(xiàn)在可以開(kāi)始游戲的試玩了!圖1.49刪除攝像機(jī)對(duì)象1.9添加一個(gè)水平面到目前為止,游戲已經(jīng)取得了不錯(cuò)的進(jìn)展,已經(jīng)可以以第一人稱視角的模式在整個(gè)游戲環(huán)境中行走和探索了。不過(guò),這個(gè)游戲環(huán)境還有很多值得改進(jìn)的地方。例如,floor網(wǎng)格現(xiàn)在就如圖1.50所示的那樣孤零零地懸浮在游戲世界的空中,沒(méi)有任何的支撐。更離譜的圖1.50整個(gè)世界地面懸浮在空中,沒(méi)有任何的支撐是,當(dāng)走出了地面邊緣的時(shí)候,就會(huì)掉下一個(gè)無(wú)底的深淵。所以現(xiàn)在需要在地面下面添加一片水域,這樣場(chǎng)景的環(huán)境就更加完整了。為了向這個(gè)游戲中添加水資源,可以使用另一種Unity中預(yù)置的資源。在項(xiàng)目(Project)面板中依次打開(kāi)“StandardAssets|Environment|Water|Water|Prefabs”文件夾,然后將“WaterProDaytime”資源從項(xiàng)目(Project)面板中拖動(dòng)到場(chǎng)景中,如圖1.51所示,這是一個(gè)圓形的對(duì)象,但是實(shí)際上的尺寸比所需要的小得多。圖1.51向環(huán)境中添加水資源在向場(chǎng)景中添加了水資源預(yù)設(shè)體(Prefab)之后,將其放置在地平面的下面,然后使用“Scale”工具(R)來(lái)變大水資源預(yù)設(shè)體(Prefab)的平面(X,Z)大小,一直擴(kuò)大到遙遠(yuǎn)的地平線為止。這樣就使得地面網(wǎng)格看起來(lái)好像是一望無(wú)際的大海之中的一個(gè)小孤島,完成后的效果如圖1.52所示。圖1.52環(huán)境中水資源面積的調(diào)整以及最后的大小現(xiàn)在,在一個(gè)游戲(Game)選項(xiàng)卡中開(kāi)始另一個(gè)測(cè)試。在工具欄上按下“Play”按鈕,然后以第一人稱視角模式來(lái)完成角色的導(dǎo)航。如圖1.53所示,可以看到關(guān)卡中的水面,當(dāng)然,在水面上是無(wú)法行走的,同樣也不能在這里面游泳和潛水。如果真的走到了水面上,就會(huì)掉進(jìn)去,好像這些水根本就不存在一樣?,F(xiàn)在的水只是一個(gè)裝飾,僅僅起了一個(gè)使場(chǎng)景看起來(lái)更真實(shí)的作用。圖1.53以FPS模式對(duì)有水的環(huán)境進(jìn)行測(cè)試現(xiàn)在場(chǎng)景中的水是虛無(wú)縹緲的,看得見(jiàn)卻摸不著,但玩家可以輕易地從這些水中穿過(guò),就好像它們是不存在的一樣。Unity現(xiàn)在并不會(huì)將這些水當(dāng)作固態(tài)或者半固態(tài)的物體來(lái)對(duì)待。通過(guò)給物體添加上一個(gè)盒子碰撞體(BoxCollider)組件,就可以使其具有固體的性質(zhì),關(guān)于碰撞體(Collider)和物理屬性(Physics)的內(nèi)容,將會(huì)在第3章中進(jìn)行更詳細(xì)的講解。現(xiàn)在,簡(jiǎn)單快速地給場(chǎng)景中的水對(duì)象添加上一個(gè)固體的屬性,只需要在層次(Hierarchy)面板上將水對(duì)象選中,然后再在應(yīng)用程序菜單上依次選中“Component|Physics|BoxCollider”,如圖1.54所示。向一個(gè)選中的對(duì)象上添加一個(gè)組件會(huì)改變這個(gè)對(duì)象本身的表現(xiàn)。即便如此,也千萬(wàn)不要有添加越多組件,對(duì)象越完美的錯(cuò)誤觀點(diǎn)。其實(shí)應(yīng)該在保證功能的前提下,為一個(gè)對(duì)象添加盡量少的附件,這種策略可以使工作流變得簡(jiǎn)單、整潔,并具有更好的性能優(yōu)化。圖1.54向水資源對(duì)象添加一個(gè)盒子碰撞體(BoxCollider)當(dāng)向水資源中添加了一個(gè)盒子碰撞體(BoxCollider)之后,就會(huì)在網(wǎng)格周圍出現(xiàn)一個(gè)綠色的籠狀網(wǎng)格。這個(gè)綠色的籠狀網(wǎng)格大概表示了水資源對(duì)象的體積和形狀,也就是說(shuō)Unity認(rèn)為這個(gè)區(qū)域就是一個(gè)固體,如圖1.55所示。圖1.55盒子碰撞體(BoxCollider)的近似體積現(xiàn)在當(dāng)控制游戲中的角色走到水面上去時(shí),就會(huì)發(fā)現(xiàn)角色會(huì)在水面上移動(dòng),而不會(huì)掉下去。當(dāng)然,更真實(shí)的效果應(yīng)該是這個(gè)角色能在水中游泳,雖然現(xiàn)在的“水上漂”有點(diǎn)假,總比掉下去要好多了。想讓角色能在水中像真的一樣游泳,需要更多的工作,這里暫不涉及。如果需要將盒子碰撞體的功能從水中去掉,返回到初始的虛無(wú)狀態(tài),則首先選中水對(duì)象,然后單擊它的“BoxCollider”組件右上方的齒輪圖標(biāo),然后選中下面菜單中的“RemoveComponent”選項(xiàng),如圖1.56所示。圖1.56移除一個(gè)組件1.10添加一個(gè)用來(lái)采集的金幣至此,該游戲已經(jīng)有了很多功能,例如一個(gè)完整的環(huán)境、一個(gè)第一人稱視角控制器、一片大海。不過(guò),本章設(shè)計(jì)的是一個(gè)金幣采集游戲,但是現(xiàn)在這個(gè)游戲場(chǎng)景中還沒(méi)有任何可以采集的金幣。為了實(shí)現(xiàn)這些功能,需要編寫一些C#腳本,這些腳本要到下一章才會(huì)看到。然而可以創(chuàng)建一些金幣對(duì)象,如將一個(gè)圓柱體(Cylinder)對(duì)象變形成一個(gè)金幣。下面先來(lái)創(chuàng)建一個(gè)圓柱體對(duì)象,操作方法是從應(yīng)用程序菜單處依次選擇“GameObject|3DObject|Cylinder”,如圖1.57所示。圖1.57創(chuàng)建一個(gè)圓柱體(Cylinder)對(duì)象最初,這個(gè)圓柱體(Cylinder)對(duì)象看起來(lái)一點(diǎn)也不像是一個(gè)金幣。不過(guò)它的外形是很容易改變的,只需要按著Z軸將圓柱體(Cylinder)變薄即可。切換到“Scale”工具(R),然后向內(nèi)減小圓柱體(Cylinder)的長(zhǎng)度,如圖1.58所示。圖1.58將圓柱體(Cylinder)對(duì)象變成一個(gè)金幣形狀在改變了金幣的大小和形狀之后,它自帶的碰撞體的大小與金幣的體積就完全不一樣了。碰撞體的體積要比金幣大很多,如圖1.58所示。默認(rèn)情況下,圓柱體(Cylinder)自帶的是一個(gè)膠囊型(Capsule)碰撞體,而不是之前見(jiàn)過(guò)的盒狀碰撞體??梢栽诮饚疟贿x中之后,從檢查(Inspector)面板處來(lái)改變“Radius”屬性的值,這將改變膠囊碰撞體(CapsuleCollider)的大小,如圖1.59所示。將這個(gè)值調(diào)小,使得膠囊碰撞體的大小與金幣更加接近。或者,選擇將膠囊碰撞體(CapsuleCollider)完全刪除,然后再添加一個(gè)盒子碰撞體(BoxCollider)來(lái)代替。這兩種方法都是可行的,可以根據(jù)實(shí)際情況進(jìn)行選擇。在下一章的代碼中將會(huì)使用到碰撞體,它將用來(lái)檢測(cè)玩家與金幣之間的接觸。圖1.59調(diào)整金幣的膠囊碰撞體(CapsuleCollider)尺寸至此,已經(jīng)將金幣的形狀和結(jié)構(gòu)設(shè)計(jì)好了。接下來(lái)的一章還要對(duì)金幣很多方面進(jìn)行改進(jìn)。例如,需要給金幣添加一個(gè)有金屬光澤的外觀,還要使這個(gè)金幣可以被采集。本章僅僅使用了Unity自帶的基本工具,就產(chǎn)生了一個(gè)形狀看起來(lái)很像金幣的對(duì)象。1.11小結(jié)現(xiàn)在已經(jīng)為金幣采集游戲的開(kāi)發(fā)打下了良好的基礎(chǔ),關(guān)于這個(gè)游戲的功能部分將會(huì)在下一章中完成和實(shí)現(xiàn)?,F(xiàn)在,讀者已經(jīng)掌握了如何從零開(kāi)始創(chuàng)建一個(gè)Unity項(xiàng)目,并使用網(wǎng)格、貼圖和場(chǎng)景來(lái)充實(shí)這個(gè)項(xiàng)目。另外,讀者也已經(jīng)了解了如何為游戲創(chuàng)建一個(gè)場(chǎng)景,以及如何使用各種資源來(lái)完善游戲的功能。這些資源包括水、第一人稱視角控制器和原型資源庫(kù)等。在下一章中,將為金幣添加可采集的特性,并為游戲添加一系列的邏輯,使得游戲有輸或者贏的結(jié)局。

第2章金幣采集游戲(Ⅱ)這一章將會(huì)在第1章建立好的游戲基礎(chǔ)上繼續(xù)進(jìn)行。在這個(gè)金幣采集游戲中,玩家可以第一人稱視角模式在整個(gè)游戲環(huán)境中進(jìn)行漫游,在游戲規(guī)定時(shí)間到達(dá)之前,尋找并采集到所有的金幣。如果在游戲規(guī)定時(shí)間結(jié)束前,玩家就已經(jīng)完成了所有金幣的采集工作,則視為游戲勝利。反之,如果到游戲規(guī)定時(shí)間結(jié)束時(shí),玩家并沒(méi)有完成所有金幣的采集工作,則視為游戲失敗。到目前為止,已經(jīng)在這個(gè)項(xiàng)目中添加了一個(gè)完整的環(huán)境,環(huán)境中包括地面、道具、水、一個(gè)第一人稱視角的控制器,及一個(gè)看起來(lái)已經(jīng)具有金幣形狀但還不能被采集的金幣對(duì)象。本章繼續(xù)完善這個(gè)游戲,最后將實(shí)現(xiàn)金幣可以被玩家采集,系統(tǒng)中還有一個(gè)可以檢測(cè)游戲進(jìn)行時(shí)間的計(jì)時(shí)器。從本質(zhì)上來(lái)說(shuō),這一章中的主要工作是為游戲添加邏輯和規(guī)則。為了實(shí)現(xiàn)這一目標(biāo),需要使用C#編寫一些代碼,所以本章的學(xué)習(xí)需要對(duì)編程有一些基礎(chǔ)。這本書主要是Unity的功能介紹以及如何使用Unity游戲開(kāi)發(fā)引擎,但是程序的編寫并不在本書的范圍內(nèi),因此,假設(shè)本書的讀者已經(jīng)有了編寫代碼的能力??傮w而言,本章將涉及的主題如下:材質(zhì)(Material)的制作預(yù)設(shè)體(Prefab)使用C#進(jìn)行游戲編程腳本文件的編寫使用粒子(Particle)系統(tǒng)游戲的構(gòu)建和編譯2.1創(chuàng)建一個(gè)金幣的材質(zhì)在上一章結(jié)束時(shí),通過(guò)將一個(gè)初始的圓柱形(Cylinder)對(duì)象進(jìn)行不均勻的縮放,從而產(chǎn)生了一個(gè)基本的金幣對(duì)象。依次單擊應(yīng)用程序菜單上的“GameObject|3DObject|Cylinder”可以創(chuàng)建該對(duì)象,結(jié)果如圖2.1所示。從概念上來(lái)說(shuō),金幣對(duì)象是游戲邏輯中的一個(gè)基本單位,玩家在游戲時(shí)間耗盡之前要盡力地去采集這些金幣。這意味著這些金幣并不能僅僅是被看到就行了,其主要目的是實(shí)現(xiàn)游戲的功能,玩家是否收集到了金幣將意味不同的游戲結(jié)果。因此,現(xiàn)在的金幣對(duì)象還缺少兩個(gè)重要的方面。首先,這個(gè)金幣看起來(lái)很陰暗,而且顏色還是灰色的,它完全無(wú)法吸引玩家的注意力。再者,這個(gè)金幣對(duì)象無(wú)法被玩家采集。不過(guò),玩家可以穿過(guò)金幣,就好像什么都沒(méi)有發(fā)生一樣。圖2.1到目前為止的金幣對(duì)象本章和下一章中講到的金幣采集游戲的完整項(xiàng)目程序可以在本書配套文件的Chapter02/CollectionGame文件夾中找到。這一節(jié)將集中講述如何使用材質(zhì)(Material)改善金幣的外觀。一個(gè)材質(zhì)其實(shí)就是一個(gè)算法(或者說(shuō)指令集),它指定了金幣的外觀所呈現(xiàn)的樣式。一個(gè)材質(zhì)并不僅僅指物體在顏色方面看起來(lái)怎樣,它同樣定義了物體表面是光滑的還是粗糙的,光照射到物體上之后是發(fā)生鏡反射還是漫反射。這一點(diǎn)必須要搞清楚才能明白為什么貼圖和材質(zhì)是兩種不同的東西。貼圖是指一個(gè)加載到計(jì)算機(jī)存儲(chǔ)器中的圖像文件,可以通過(guò)它的UV貼圖將一個(gè)三維物體覆蓋上。相反的,材質(zhì)定義了一個(gè)或者多個(gè)貼圖是如何結(jié)合在一起,并應(yīng)用到了一個(gè)對(duì)象外觀的塑造上的。如果需要在項(xiàng)目中創(chuàng)建一個(gè)新的材質(zhì)資源,就可以在項(xiàng)目(Project)面板的空白位置單擊鼠標(biāo)右鍵,然后在彈出的上下文菜單中,選擇“Create|Material”,如圖2.2所示。或者在應(yīng)用程序菜單處依次選中“Assets|Create|Material”。圖2.2創(chuàng)建一個(gè)材質(zhì)有時(shí)一個(gè)材質(zhì)也可以被稱作“Shader”。如果需要,就可以使用著色器語(yǔ)言(ShaderLanguage)來(lái)創(chuàng)建一個(gè)自定義的材質(zhì)。當(dāng)然也可以使用Unity中自帶的一些插件,例如“ShaderForge”等。當(dāng)成功地創(chuàng)建了一個(gè)新的材質(zhì)之后,接下來(lái)就要給這個(gè)材質(zhì)起一個(gè)名字。此處將這個(gè)材質(zhì)命名為“mat_GoldCoin”。這個(gè)名字的前半部分為“mat”,這樣能讓大家一下子就知道這是一個(gè)材質(zhì)資源?,F(xiàn)在只需要在文本編輯區(qū)域輸入新的名字,即可完成對(duì)這個(gè)材質(zhì)的重命名。以后也可隨時(shí)在這個(gè)材質(zhì)上雙擊鼠標(biāo),來(lái)完成對(duì)名字的修改,如圖2.3所示。圖2.3為一個(gè)材質(zhì)重命名接下來(lái),如果還沒(méi)有選中這個(gè)材質(zhì)資源,那么就在項(xiàng)目(Project)面板上選中它,這時(shí)其所有屬性都會(huì)在對(duì)象檢查(Inspector)面板處顯示出來(lái)。這里的屬性數(shù)量很多。注意,可以在這個(gè)對(duì)象的Inspector面板底部看到這個(gè)材質(zhì)基于當(dāng)前設(shè)定的預(yù)覽圖,當(dāng)在檢查(Inspector)面板處修改了材質(zhì)設(shè)定,下面的預(yù)覽圖也會(huì)及時(shí)地根據(jù)調(diào)整進(jìn)行更新,如圖2.4所示。圖2.4從對(duì)象檢查(Inspector)面板處對(duì)材質(zhì)的屬性進(jìn)行修改下面為金幣創(chuàng)造一個(gè)金光閃閃的材質(zhì)。首先需要指定著色器(Shader)的類型,這是因?yàn)檫@個(gè)類型決定了其他可用的參數(shù)。著色器(Shader)的類型決定了系統(tǒng)將采用哪種算法來(lái)計(jì)算對(duì)象的陰影。有很多種類型供選擇,但是最經(jīng)常使用的類型就是“Standard”或者“Standard(Specularsetup)”。對(duì)于游戲中使用的金幣,可以將著色器(Shader)的類型設(shè)定為“Standard”,如圖2.5所示。圖2.5設(shè)定材質(zhì)的著色器(Shader)類型此時(shí),在預(yù)覽(Preview)面板中顯示的是陰暗的灰色,這與所需要的相差太多了?,F(xiàn)在需要的是一個(gè)金色,首先指定反射(Albedo)的屬性。單擊反射(Albedo)右側(cè)的色板,然后會(huì)彈出一個(gè)顏色選擇器,在其中選出所需要的金色。這時(shí),反射(Albedo)右側(cè)的色板也會(huì)實(shí)時(shí)根據(jù)材質(zhì)的變化更新,如圖2.6所示。圖2.6將反射(Albedo)的值指定金色現(xiàn)在,金幣的材質(zhì)比以前好多了,但是需要的游戲?qū)ο笫墙饚牛簿褪钦f(shuō),它們看起來(lái)應(yīng)該是金光閃閃的。為了將這個(gè)效果添加到材質(zhì)庫(kù)中,可單擊并滑動(dòng)對(duì)象檢查(Inspector)面板處“Metallic”屬性右側(cè)的滑動(dòng)條,將值設(shè)定為1。這個(gè)值設(shè)為1表明會(huì)將材質(zhì)設(shè)定為一個(gè)金屬表面,而不是一個(gè)像布或者頭發(fā)之類的漫反射面。同樣,此時(shí)的預(yù)覽會(huì)如同圖2.7所示的一樣,及時(shí)地根據(jù)設(shè)定的更改進(jìn)行更新。圖2.7創(chuàng)建一個(gè)金屬材質(zhì)現(xiàn)在已經(jīng)創(chuàng)建好了一個(gè)新的金屬材質(zhì),可以在預(yù)覽窗口中看到它逼真的效果了。如果需要,還可以在預(yù)覽窗口中更改材質(zhì)預(yù)覽時(shí)的形狀。默認(rèn)的情況下,材質(zhì)是以一個(gè)球形展示出來(lái)的,不過(guò)也可以以其他的基本形狀來(lái)預(yù)覽,例如正方體、圓柱體、圓環(huán)等。這樣有助于在不同的條件下對(duì)材質(zhì)進(jìn)行預(yù)覽。可以通過(guò)單擊預(yù)覽面板上方的“幾何圖形”按鈕來(lái)更改對(duì)象的形狀(見(jiàn)圖2.8)。圖2.8對(duì)一個(gè)對(duì)象上的材質(zhì)進(jìn)行預(yù)覽當(dāng)為金幣準(zhǔn)備好了材質(zhì)之后,就可以通過(guò)拖動(dòng)的方式將這個(gè)材質(zhì)直接應(yīng)用到場(chǎng)景中的網(wǎng)格上。先將做好的金幣材質(zhì)應(yīng)用到金幣上,從項(xiàng)目(Project)面板選中剛做好的材質(zhì),然后拖動(dòng)到場(chǎng)景中的金幣對(duì)象上。當(dāng)將材質(zhì)拖動(dòng)到金幣上釋放鼠標(biāo)時(shí),金幣就呈現(xiàn)出金屬效果了。這個(gè)過(guò)程如圖2.9所示。圖2.9為金幣設(shè)置材質(zhì)我們已經(jīng)成功地為金幣添加材質(zhì)了,也可以通過(guò)在場(chǎng)景選中金幣對(duì)象來(lái)查看它所使用的材質(zhì)了。同樣,也可以從檢查(Inspector)面板窗口來(lái)查看“MeshRenderer”組件。當(dāng)使用攝像機(jī)時(shí),“MeshRenderer”組件可以保證一個(gè)網(wǎng)格對(duì)象是可見(jiàn)的。組件“MeshRenderer”包含一個(gè)材質(zhì)(Materials)區(qū)域,該區(qū)域中列出了分配給這個(gè)對(duì)象的全部材質(zhì)。在材質(zhì)(Materials)區(qū)域選中材質(zhì)的名字之后,Unity就會(huì)自動(dòng)地從項(xiàng)目(Project)面板上選中材質(zhì),這樣就可以快速簡(jiǎn)單地對(duì)材質(zhì)進(jìn)行定位,如圖2.10所示,組件“MeshRenderer”列出了分配給一個(gè)對(duì)象的所有材質(zhì)。圖2.10組件“MeshRenderer”列出了分配給一個(gè)對(duì)象的所有材質(zhì)一個(gè)網(wǎng)格對(duì)象有時(shí)會(huì)擁有多個(gè)材質(zhì),對(duì)象的每一個(gè)面都分配不同的材質(zhì)。不過(guò)為了獲得最佳的游戲性能,最好在滿足需求的基礎(chǔ)上使用盡可能少的材質(zhì)。如果可能,盡量讓多個(gè)游戲?qū)ο蠖际褂猛粋€(gè)材質(zhì),這樣做可以很明顯地提高游戲的性能。如果想要獲得關(guān)于游戲渲染性能優(yōu)化方面的更多內(nèi)容,可訪問(wèn)\hhttp://docs.U/Manual/OptimizingGraphicsPerformance.html的在線文檔。已經(jīng)完成可以用來(lái)收集的金幣的材質(zhì)了,它看起來(lái)很漂亮,不過(guò),并沒(méi)有徹底地完成金幣部分。當(dāng)玩家接觸到金幣時(shí),它并不會(huì)消失,而且也沒(méi)有機(jī)制來(lái)記錄玩家到底采集到了多少金幣。接下來(lái)就需要開(kāi)始編寫程序了。2.2Unity中的C#腳本為游戲定義邏輯、規(guī)則和行為的時(shí)候,往往需要使用到腳本。如果想將那些靜態(tài)的、無(wú)生命的場(chǎng)景和對(duì)象轉(zhuǎn)換成為可以進(jìn)行交互的環(huán)境和對(duì)象,那么開(kāi)發(fā)人員就需要編寫代碼。這些代碼定義了這些物體在遇到了指定情況之后,應(yīng)該做出什么樣的反應(yīng)。金幣采集游戲也需要編寫代碼才能實(shí)現(xiàn)所有的功能。這個(gè)游戲需要實(shí)現(xiàn)3個(gè)主要的功能:能夠感知玩家是否收集到金幣;在游戲進(jìn)行中,能夠及時(shí)了解到玩家收集的金幣數(shù)量;能確定游戲時(shí)間是否已經(jīng)結(jié)束。在Unity中并沒(méi)有包含一個(gè)能實(shí)現(xiàn)上述功能的模塊。所以必須自己來(lái)編寫一些代碼來(lái)實(shí)現(xiàn)這些功能。Unity中支持兩種語(yǔ)言,即UnityScript語(yǔ)言(有時(shí)候稱之為JavaScript語(yǔ)言)和C#語(yǔ)言。這兩種語(yǔ)言功能都很強(qiáng)大,但是本書中主要采用的是C#語(yǔ)言。這是因?yàn)閺陌l(fā)展的趨勢(shì)來(lái)看,JavaScript的使用率將會(huì)逐漸下降?,F(xiàn)在開(kāi)始對(duì)這個(gè)主要功能進(jìn)行編程。首先在項(xiàng)目(Project)面板的空白區(qū)域單擊鼠標(biāo)右鍵,然后在彈出的上下文菜單中依次選擇“Create|C#Script”,就可以創(chuàng)建一個(gè)新的腳本文件。另外,也可以從應(yīng)用程序菜單處依次選擇“Assets|Create|C#Script”來(lái)創(chuàng)建一個(gè)新的腳本文件,如圖2.11所示。圖2.11創(chuàng)建一個(gè)新的C#腳本當(dāng)創(chuàng)建了腳本之后,需要為腳本起一個(gè)描述性的名字。本書起的名字為“Coin.cs”。在Unity中,每一個(gè)腳本文件都對(duì)應(yīng)一個(gè)與其同名的類。因此,“Coin.cs”文件對(duì)應(yīng)的就是“Coin”類。這個(gè)“Coin”類將封裝一個(gè)金幣的所有行為,并最終會(huì)附加到場(chǎng)景中的金幣上,如圖2.12所示。圖2.12為腳本文件命名在對(duì)象檢查(Inspector)面板中雙擊Coin.cs,就可以使用MonoDevelop打開(kāi)這個(gè)文件。MonoDevelop是一款Unity自帶的第三方IDE應(yīng)用,它可以實(shí)現(xiàn)對(duì)游戲中的代碼進(jìn)行編寫和修改。當(dāng)一個(gè)文件在MonoDevelop中打開(kāi)之后,它的內(nèi)容就會(huì)如代碼示例2.1所示的在MonoDevelop中顯示出來(lái)。代碼示例2.1:

usingUnityEngine;

usingSystem.Collections;

publicclassCoin:MonoBehaviour

{

//Usethisforinitialization

voidStart(){}

//Updateiscalledonceperframe

voidUpdate(){}

}

代碼示例的下載可以使用自己的賬號(hào)從\h.處下載本書的代碼示例。無(wú)論你在哪里購(gòu)買的本書,都可以訪問(wèn)\h/support并進(jìn)行注冊(cè),書中的資源也可以通過(guò)電子郵件的形式發(fā)送給你??梢园凑杖缦虏襟E來(lái)下載這些文件:使用電子郵箱地址在頁(yè)面上注冊(cè),如果已經(jīng)注冊(cè)過(guò)了,那么直接登錄即可;找到并使用鼠標(biāo)單擊位于頁(yè)面頂端的“SUPPORT”;單擊“CodeDownloads&Errata”;在搜索search框中輸入要下載資源的書的名字;選擇要下載資源的書;在下拉菜單中選中購(gòu)買本書的地點(diǎn);單擊“CodeDownload”。將這些文件下載了之后,要確定解壓縮軟件已經(jīng)更新到了最新的版本:WinRAR/7-ZipforWindows;Zipeg/iZip/UnRarXforMac;7-Zip/PeaZipforLinux。默認(rèn)情況下,所有新創(chuàng)建的類都派生自“MonoBehavior”類,這個(gè)類中定義了一些對(duì)所有組件都通用的函數(shù)。“Coin”類具有兩個(gè)自動(dòng)生成的函數(shù),也就是Start()和Update()。這些函數(shù)都是由Unity自動(dòng)調(diào)用的事件。當(dāng)游戲?qū)ο螅P(guān)聯(lián)了這個(gè)游戲腳本)在場(chǎng)景中創(chuàng)建時(shí),就會(huì)調(diào)用Start()函數(shù)。Update()函數(shù)會(huì)在每一幀被附加了游戲腳本的對(duì)象中調(diào)用一次。Start()函數(shù)主要用來(lái)實(shí)現(xiàn)代碼的初始化,Update()函數(shù)主要用來(lái)實(shí)現(xiàn)那些隨著事件推移的行為,例如運(yùn)動(dòng)和變化?,F(xiàn)在,將新創(chuàng)建的腳本文件與場(chǎng)景中的金幣對(duì)象進(jìn)行管理,可以從項(xiàng)目(Project)面板處將“Coin.cs”文件拖曳到金幣對(duì)象上。當(dāng)完成以后,一個(gè)新的金幣組件就被添加到了游戲?qū)ο笊稀_@意味著這個(gè)腳本已經(jīng)關(guān)聯(lián)到了游戲?qū)ο笊?,如圖2.13所示,一個(gè)關(guān)聯(lián)了腳本的游戲?qū)ο?。圖2.13一個(gè)關(guān)聯(lián)了腳本的游戲?qū)ο螽?dāng)一個(gè)腳本與一個(gè)游戲?qū)ο箨P(guān)聯(lián)到一起之后,這個(gè)腳本就作為這個(gè)游戲?qū)ο蟮囊粋€(gè)組件而存在。一個(gè)腳本文件可以添加到多個(gè)游戲?qū)ο笊希踔量梢员欢啻翁砑拥酵粋€(gè)游戲?qū)ο笊?。每個(gè)組件都代表著一個(gè)單獨(dú)而且不同的類的實(shí)例化。當(dāng)一個(gè)腳本以這種方式添加進(jìn)來(lái)之后,Unity會(huì)自動(dòng)地調(diào)用它的函數(shù),例如Start()和Update()??梢栽赟tart()函數(shù)中加入一個(gè)Debug.Log語(yǔ)句來(lái)確認(rèn)腳本是否能正常工作,這個(gè)語(yǔ)句在場(chǎng)景中的游戲?qū)ο蟊粍?chuàng)建時(shí)在命令行窗口輸出一個(gè)調(diào)試信息。查看如下所示的代碼示例2.2。代碼示例2.2:

usingUnityEngine;

usingSystem.Collections;

publicclassCoin:MonoBehaviour

{

//start()是初始化函數(shù)

voidStart(){

Debug.Log("ObjectCreated");

}

//Update在每一幀調(diào)用一次

voidUpdate(){

}

}

如果按下工具欄上的“Play”鍵,或者按下鍵盤上的“Ctrl+P”組合鍵,來(lái)運(yùn)行這個(gè)向游戲?qū)ο笊咸砑恿饲懊娴哪莻€(gè)腳本的游戲,就會(huì)在控制臺(tái)窗口中看到一條內(nèi)容為“ObjectCreated”的信息,每當(dāng)這個(gè)類進(jìn)行實(shí)例化的時(shí)候,都會(huì)輸出一次(見(jiàn)圖2.14)。圖2.14在控制臺(tái)窗口處輸出消息現(xiàn)在已經(jīng)為Coin類創(chuàng)建了最基本的腳本,并且已經(jīng)將這個(gè)腳本成功附加到了金幣對(duì)象上。接下來(lái),繼續(xù)編寫一些函數(shù),這些函數(shù)將會(huì)記錄采集過(guò)的金幣信息。2.3對(duì)金幣進(jìn)行計(jì)數(shù)如果整個(gè)場(chǎng)景里只有一個(gè)金幣,那么這個(gè)金幣采集游戲就有些名不符實(shí)了。本游戲的核心設(shè)計(jì)思路就是在一個(gè)關(guān)卡中應(yīng)該包含很多個(gè)金幣,玩家應(yīng)該在系統(tǒng)計(jì)時(shí)結(jié)束前收集完這些金幣?,F(xiàn)在,如果想要知道玩家是否將所有的金幣都收集齊了,首先得先知道這個(gè)場(chǎng)景中總共有多少個(gè)金幣。畢竟如果不知道金幣的總量,也就無(wú)法知道是否已經(jīng)將所有的金幣收集全了。所以,第一個(gè)任務(wù)就是通過(guò)Coin類來(lái)輕松地知道任意時(shí)刻金幣的總數(shù)。下面給出實(shí)現(xiàn)這一功能的Coin類,具體的如代碼示例2.3所示。代碼示例2.3:

//-------------------------

usingUnityEngine;

usingSystem.Collections;

//-------------------------

publicclassCoin:MonoBehaviour

{

//-------------------------

//追蹤scene中金幣數(shù)量

publicstaticintCoinCount=0;

//-------------------------

//start()是初始化函數(shù)

voidStart()

{

//創(chuàng)建游戲?qū)ο?增加金幣的數(shù)量

++Coin.CoinCount;

}

//-------------------------

//當(dāng)游戲?qū)ο蟊讳N毀時(shí)調(diào)用OnDestroy函數(shù)

voidOnDestroy()

{

//減少金幣數(shù)量

--Coin.CoinCount;

//檢查剩余金幣數(shù)量

if(Coin.CoinCount<=0)

{

//玩家獲得勝利

}

}

//-------------------------

}

//-------------------------

下面就代碼示例2.3進(jìn)行以下幾點(diǎn)總結(jié)。Coin類中有一個(gè)靜態(tài)的成員變量——CoinCount。這個(gè)變量是靜態(tài)的,可以被這個(gè)類的所有實(shí)例所共享。該變量中記錄了場(chǎng)景中金幣的總數(shù),類中的每個(gè)實(shí)例都可以訪問(wèn)該變量。每當(dāng)場(chǎng)景中的一個(gè)金幣游戲?qū)ο蟊粍?chuàng)建時(shí),就會(huì)自動(dòng)調(diào)用Start()函數(shù)。在場(chǎng)景啟動(dòng)時(shí)調(diào)用Start函數(shù)就可以設(shè)定游戲初始的金幣。每當(dāng)初始化一個(gè)實(shí)例

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論