版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Unity5.x游戲開發(fā)實戰(zhàn)目錄\h第1章金幣采集游戲(Ⅰ)\h1.1游戲設(shè)計\h1.2從頭開始——Unity中的項目\h1.3項目和項目文件夾\h1.4開始一個關(guān)卡\h1.5變換和導(dǎo)航\h1.6場景的建立\h1.7光源和天空\h1.8游戲測試與游戲選項卡\h1.9添加一個水平面\h1.10添加一個用來采集的金幣\h1.11小結(jié)\h第2章金幣采集游戲(Ⅱ)\h2.1創(chuàng)建一個金幣的材質(zhì)\h2.2Unity中的C#腳本\h2.3對金幣進(jìn)行計數(shù)\h2.4金幣采集\h2.5金幣與預(yù)設(shè)體\h2.6定時器和倒計時\h2.7慶典和焰火\h2.8游戲測試\h2.9構(gòu)建\h2.10小結(jié)\h第3章太空射擊游戲(Ⅰ)\h3.1對完整的項目進(jìn)行展望\h3.2開始太空射擊游戲\h3.3創(chuàng)建玩家對象\h3.4Player輸入\h3.5配置游戲中的攝像機\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ù)和評分——UI和文本對象\h4.6計分功能——為文本對象編寫腳本\h4.7游戲的潤色\h4.8測試與調(diào)試\h4.9游戲的構(gòu)建\h4.10小結(jié)\h第5章二維冒險游戲(Ⅰ)\h5.1二維冒險游戲——開始\h5.2資源的導(dǎo)入\h5.3開始創(chuàng)建游戲的環(huán)境\h5.4環(huán)境物理學(xué)\h5.5創(chuàng)建一個玩家\h5.6編寫控制玩家移動的腳本\h5.7優(yōu)化\h5.8小結(jié)\h第6章二維冒險游戲(Ⅱ)\h6.1移動的平臺\h6.2創(chuà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項目概覽\h7.2入門指南\h7.3地形的構(gòu)建\h7.4導(dǎo)航與導(dǎo)航網(wǎng)格\h7.5構(gòu)建一個NPC\h7.6創(chuàng)建巡邏的NPC\h7.7小結(jié)\h第8章有智慧的敵人(Ⅱ)\h8.1敵人的人工智能——視野范圍\h8.2有限狀態(tài)機概述\h8.3巡邏狀態(tài)\h8.4追逐狀態(tài)\h8.5攻擊狀態(tài)\h8.6小結(jié)第1章金幣采集游戲(Ⅰ)本章將會以一個十分有趣的采集類游戲作為Unity的入門。即使你以前從來都沒有使用過Unity這個游戲引擎,也無需有任何的擔(dān)心。我們的教程將會一步一步地來指導(dǎo)你熟悉Unity。到了下一章結(jié)束的時候,你就可以利用所學(xué)的內(nèi)容構(gòu)造出一個比較簡單但是功能相當(dāng)完善的游戲。這將是一個非常重要的過程,因為在從始至終的開發(fā)中,你將會了解到整個游戲的實現(xiàn)流程。在本章中將會學(xué)習(xí)到如下內(nèi)容:Unity游戲的設(shè)計Unity項目和目錄Unity資源(Asset)的導(dǎo)入和配置Unity游戲關(guān)卡的設(shè)計Unity游戲設(shè)計中的對象Unity中的結(jié)構(gòu)樹(Hierarchies)1.1游戲設(shè)計現(xiàn)在就來開始游戲的開發(fā)之旅吧。首先,這是一個第一人稱視角的游戲,玩家必須在規(guī)定時間內(nèi)通過不斷地移動去采集所有的金幣。如果玩家在時間耗盡時還沒有采集到所有金幣,則視為玩家失敗,游戲結(jié)束。如果玩家在時間耗盡之前就將全部的金幣采集完畢,則視為玩家勝利。這款游戲的方向控制采用標(biāo)準(zhǔn)“WASD”的模式,按下“W”鍵向前運動,按下“A”鍵向左運動,按下“S”鍵向右運動,按下“D”鍵向后運動。視角的變換由鼠標(biāo)控制,當(dāng)走到金幣的位置時就可以完成金幣的采集。如圖1.1所示,采用Unity編輯器實現(xiàn)對游戲行為的設(shè)計。開發(fā)這個游戲的最大優(yōu)勢就在于,通過整個的開發(fā)過程,可以了解到Unity的全部關(guān)鍵特性,同時無需使用任何額外的軟件來產(chǎn)生游戲所需的資源(Asset),例如貼圖(Textures)、網(wǎng)格(Meshes)以及材質(zhì)(Materials)等。圖1.1金幣采集游戲(最終完成效果)本章和下一章介紹了這個金幣采集游戲的開發(fā)過程,關(guān)于這個金幣采集游戲的完整代碼,可以在本書的配套文件Chapter01/CollectionGame目錄下找到。1.2從頭開始——Unity中的項目當(dāng)在Unity中創(chuàng)建一個新游戲時,如現(xiàn)在的金幣采集游戲,都需要先創(chuàng)建一個新的項目。一般來說,Unity中的“項目”這個詞就等同于“游戲”。在Unity中有兩種方法來創(chuàng)建一個新的項目,但其實這兩者并沒有太大的差別。在打開的Unity的圖形化編輯界面中,可以看到一個場景或者關(guān)卡,從應(yīng)用菜單上依次選擇“File|NewProject”,如圖1.2所示。這時Unity會詢問是否對當(dāng)前已經(jīng)打開的項目進(jìn)行保存,這時需要根據(jù)自己的實際情況來選擇“Yes”或者“No”。在選擇完“NewProject”以后,Unity將會出現(xiàn)一個項目創(chuàng)建向?qū)?,根?jù)這個向?qū)У囊螅涂梢砸徊揭徊酵瓿身椖康膭?chuàng)建工作了。圖1.2使用主菜單來創(chuàng)建一個新的項目如果是第一次啟動Unity,則會看到一個歡迎的對話框,如圖1.3所示。在這個對話框中,可以通過選擇“NEWPROJECT”按鈕來創(chuàng)建新的項目。圖1.3Unity的歡迎界面選擇“NEWPROJECT”創(chuàng)建向?qū)е?,Unity就會按照指定的一些基本設(shè)置來創(chuàng)建一個新的項目。此處需要填寫項目的名稱(例如CollectionGame),然后在電腦上選擇一個用來保存自動生成項目文件的文件夾。最后,注意3D和2D的這兩個按鈕,當(dāng)單擊3D按鈕時,這意味著要創(chuàng)建的是一個三維游戲;如果單擊的是2D按鈕,這意味著將要創(chuàng)建一個二維的游戲,所有這些步驟都完成之后,需要單擊“Createproject”按鈕來完成整個項目的生成過程,如圖1.4所示。圖1.4創(chuàng)建一個新的項目1.3項目和項目文件夾現(xiàn)在Unity已經(jīng)創(chuàng)建了一個空白的新項目。這里就是開發(fā)一個新游戲的起點,在這個新創(chuàng)建的項目中并不包含任何的東西,沒有任何的網(wǎng)格,貼圖或者其他資源。這一點只需要檢查一下位于Unity編輯器界面下方的項目(Project)面板區(qū)域就可以確定。這個項目(Project)面板中會顯示項目文件夾中的全部資源,同時它也對應(yīng)著一個本地驅(qū)動器上的文件夾,而這個文件夾就是在之前項目向?qū)е兴鶆?chuàng)建的。這個文件夾如圖1.5所示,現(xiàn)在也是空的。在這個游戲的開發(fā)過程中,還會使用到這個項目(Project)面板中的更多功能。圖1.5位于Unity開發(fā)界面的底部的項目(Project)面板如果現(xiàn)在使用的Unity開發(fā)界面的布局與圖1.5所示的有些不同,那么可以選擇將用戶開發(fā)界面的布局進(jìn)行重置,恢復(fù)為默認(rèn)布局。只需要單擊開發(fā)界面右上角的布局下拉菜單,然后再選擇“Default”,見圖1.6。圖1.6切換成默認(rèn)的開發(fā)界面布局可以在Windows操作系統(tǒng)下的資源管理器或者M(jìn)ac操作系統(tǒng)中的Finder直接查看到項目文件夾中的內(nèi)容。要做到這一點,只需要在Unity編輯器上的項目(Project)面板中單擊鼠標(biāo)右鍵,這時就會顯示出一個內(nèi)容菜單,然后在這個菜單上選擇選項“ShowinExplorer”,這個過程如圖1.7所示。圖1.7使用項目(Project)面板顯示項目文件夾單擊“ShowinExplorer”可以在默認(rèn)的系統(tǒng)文件瀏覽器中對文件夾中的內(nèi)容進(jìn)行瀏覽,如圖1.8所示。以這種方式查看文件,可以更容易地實現(xiàn)對文件的檢查、清點或者備份操作。但是,不要在Windows操作系統(tǒng)下的資源管理器或者M(jìn)ac操作系統(tǒng)中的Finder中對文件夾中的內(nèi)容進(jìn)行修改,尤其是不要進(jìn)行移動、重命名或者刪除文件的操作,這樣操作可能會導(dǎo)致Unity項目損壞。如果進(jìn)行文件的刪除和移動操作,就在Unity編輯器中的項目(Project)面板中進(jìn)行。只有這樣操作,Unity才會同時對它的元數(shù)據(jù)進(jìn)行更新,以確保項目能繼續(xù)正常工作。圖1.8從操作系統(tǒng)的文件瀏覽器中查看項目(Project)面板的內(nèi)容如果是從操作系統(tǒng)的文件瀏覽器中查看項目文件夾,就可以看到一些在項目(Project)面板中看不到的文件和文件夾,例如Library文件夾、ProjectSettings文件夾或者Temp文件夾。這些文件夾中保存的都是項目的元數(shù)據(jù)。這些文件并不是項目直接的組成部分,但是卻包含一些額外的設(shè)置和首選項信息,這些信息保證了Unity能正常運行。注意,不要試圖對這些文件夾和其中的文件進(jìn)行修改或者編輯。資源的導(dǎo)入資源是游戲開發(fā)中的原材料,也就是組成游戲的模塊。Unity中的資源包括網(wǎng)格(或者3D模型)、貼圖、各種音樂和音效、場景,其中網(wǎng)格包括各種人物、道具、植物、建筑物等;貼圖包括各種JPEG文件和PNG文件,這些圖片決定了網(wǎng)格的外觀;音樂和音效用來提高游戲真實性和氣氛;場景(Scene)是一個網(wǎng)格、紋理、音樂、音效等協(xié)同工作而組成的獨立系統(tǒng)。因此可以這樣說,游戲不能沒有資源,否則這些游戲看起來空虛而又無趣?;谶@個原因,金幣采集游戲也同樣需要資源。畢竟這個游戲需要一個可以在其中進(jìn)行移動和采集操作的環(huán)境。Unity只是一個游戲開發(fā)引擎,而并非是一個資源開發(fā)軟件。這意味著在游戲中需要的資源(例如各種人物、道具),通常是由一些設(shè)計者使用其他軟件開發(fā)出來的。然后,這些設(shè)計者將這些制作好的資源導(dǎo)出,并傳遞給Unity。Unity則負(fù)責(zé)將這些資源有機地組合到一個游戲系統(tǒng)中。這些用來設(shè)計3D模型資源的第三方軟件包括Blender(這是一款免費的軟件)、Maya或者3DMAX。而對于紋理的創(chuàng)建,可以選擇Photoshop或者GIMP(這也是一款免費的軟件)。至于音效的制作,可以選擇使用Audacity(這款軟件同樣是免費的)。當(dāng)然除了這些軟件以外,還有更多的選擇。這些軟件的具體內(nèi)容并不在本書的范圍內(nèi)。通常,Unity引擎會認(rèn)為已經(jīng)有了可以導(dǎo)入到游戲中的資源。例如,在金幣采集的游戲中將使用Unity所提供的資源?,F(xiàn)在,將這些資源導(dǎo)入到這個項目中,為此,需要首先選擇菜單欄上的“Assets”選項,然后在下拉菜單上選中“ImportPackage”,然后如圖1.9所示依次選中“Characters”“ParticleSystems”“Environment”和“Prototyping”等選項。圖1.9使用資源包導(dǎo)入(ImportPackage)菜單完成資源導(dǎo)入操作當(dāng)在菜單中進(jìn)行一個資源包的導(dǎo)入操作時,都會出現(xiàn)一個導(dǎo)入操作的對話框。在這個對話框中無需進(jìn)行任何改動,保留里面設(shè)置的默認(rèn)值,然后單擊“Import”按鈕即可。這個過程如圖1.10所示。圖1.10選擇需要導(dǎo)入的資源默認(rèn)情況下,Unity會從資源包(一個資源的庫文件)中的所有文件解壓縮到當(dāng)前項目中。在導(dǎo)入操作結(jié)束后,各種各樣的大量資源和數(shù)據(jù)將會添加到項目中,以后可以隨時使用這些文件,它們都是原來文件的副本。所以,無論對項目中的哪個文件進(jìn)行更改,都不會影響到原來文件。這些文件包括各種模型、聲音、貼圖等。圖1.11所示為在Unity項目(Project)面板的編輯器中列出的這些文件。圖1.11從項目(Project)面板中對導(dǎo)入的資源進(jìn)行瀏覽當(dāng)在應(yīng)用菜單上依次選擇了“Assets|Import”之后,如果什么資源包都沒有,那么可以從Unity的主頁https://U/上下載和安裝這些資源包。打開這個主頁之后,首先選擇“AdditionalDownloads”,然后在如圖1.12所示的頁面上選擇“StandardAssets”。圖1.12標(biāo)準(zhǔn)資源包(StandardAssets)的下載然而導(dǎo)入的資源并沒有存在于游戲之中,沒有出現(xiàn)在屏幕上,也不能做任何事情!它們只是被簡單地添加到了項目(Project)面板,其實這些資源現(xiàn)在更像是一個庫或者說是資源的倉庫,可以從其中進(jìn)行選擇來完成游戲的建立。到目前為止,這些資源已經(jīng)被內(nèi)置到了Unity之中,在之后的章節(jié)中將繼續(xù)使用它們,來完善金幣采集游戲的功能。如果想了解關(guān)于每個資源的詳細(xì)信息,可以使用鼠標(biāo)單擊選中這個資源,這時關(guān)于這個資源的詳細(xì)信息就會出現(xiàn)在Untiy編輯器右側(cè)的檢查(Inspector)面板中。檢查(Inspector)面板是一個位于開發(fā)界面右側(cè)的屬性編輯器,它是上下文敏感的,并會自動切換為顯示所選對象的屬性,如圖1.13所示。圖1.13檢查(Inspector)面板顯示了當(dāng)前選中物體的所有屬性1.4開始一個關(guān)卡現(xiàn)在已經(jīng)創(chuàng)建了一個Unity的項目,并且利用Unity的標(biāo)準(zhǔn)資源包導(dǎo)入了一個很大的資源庫,包括一些建筑類網(wǎng)格,例如墻、地板、天花板、樓梯等,將使用這些資源建立第一個關(guān)卡(level)。記住,在Unity中,一個場景(Scene)往往也就意味著一個關(guān)卡。場景和關(guān)卡這兩個詞匯在這里是沒有區(qū)別的,都是指一個三維空間,也就是游戲發(fā)生的時空?,F(xiàn)在來創(chuàng)建一個金幣采集游戲的場景,首先從應(yīng)用程序菜單依次選擇“File|New”,或者也可以在鍵盤上按下“Ctrl+N”組合鍵。當(dāng)完成了這個操作之后,一個新的空白的場景就被創(chuàng)建好了??梢栽谡紦?jù)了Unity開發(fā)界面最大部分的場景(Scene)選項卡中看到場景的預(yù)覽,如圖1.14所示。圖1.14場景(Scene)選項卡中給出了一個3D世界的預(yù)覽如圖1.14所示,在Unity中的場景(Scene)選項卡以外的其他選項卡也是可見的,并且可以使用的。這些選項卡包括游戲(Game)選項卡和動畫(Animator)選項卡。有時,選項卡的數(shù)目可能會更多。不過現(xiàn)在可以忽略除了場景以外的其他所有選項卡。場景(Scene)選項卡是為了能夠在游戲的開發(fā)中簡單快速地查看一個關(guān)卡。每一個新的場景都是空的,嚴(yán)格來說幾乎是空的。默認(rèn)情況下,每一個新的場景都是由兩個對象開始的,首先添加一個用來照亮其他任意對象的光源對象(Light),然后是一個用來從特定角度對場景中的內(nèi)容進(jìn)行顯示和渲染用的攝像機(Camera)??梢允褂瞄_發(fā)界面(見圖1.15)左側(cè)的層次(Hierarchy)面板來查看所有在場景中對象的完整列表。這個面板上顯示了場景中所有對象的名稱。在Unity中,游戲?qū)ο蟮暮x就是在場景中存在的單一、獨立的東西,無論它們是可見的還是不可見的,例如網(wǎng)格、光源、攝像機、道具等。因此,只有從層次(Hierarchy)面板才能看到游戲場景中的一切。圖1.15層次(Hierarchy)面板也可以通過在層次(Hierarchy)面板中單擊游戲中對象的名稱來選中它們。接下來為這個場景添加一個地面(Floor)。要知道,游戲中的玩家總得站在一些東西上面??梢允褂玫谌降慕\浖ㄈ鏜aya、3DSMax或者Blender)來創(chuàng)建一個地面網(wǎng)格。不過,在之前導(dǎo)入過的標(biāo)準(zhǔn)資源包中就含有可以使用的地面網(wǎng)格,這是相當(dāng)方便的。這些網(wǎng)格都是原型軟件包(PrototypingPackage)的一部分。如果想通過項目(Project)面板完成對這些資源的訪問,可以雙擊打開“StandardAssets”文件夾,然后訪問“Prototyping|Prefabs”文件夾。如圖1.16所示,可以看到這些對象,并從檢查(Inspector)面板中對它們進(jìn)行預(yù)覽。圖1.16包含了大量用于快速建立場景的網(wǎng)格的標(biāo)準(zhǔn)資源包/原型包你也可以在應(yīng)用程序菜單上依次選擇GameObject|3DObject|Plane,這樣可以更加方便地向場景(Scene)中添加地面(Floor)。不過,加進(jìn)來的這個地面看起來一片灰暗,給人一種枯燥無味的感覺。當(dāng)然,這個地面的外觀是可改變的。正如我們在后面即將看到的一樣,Unity中允許對物體外觀進(jìn)行改變。不過,在本書中,我們將從項目面板(Projectpanel)中的標(biāo)準(zhǔn)資源包里找到一個專門的地面網(wǎng)格(floormesh)來使用。圖1.16所示的名為“FloorPrototype64x01x64”的網(wǎng)格十分適合作為一個地面,現(xiàn)在只需要簡單地將項目(Project)面板(Panel)中的對象拖曳到場景(Scene)視圖中,然后釋放鼠標(biāo)即可完成這個網(wǎng)格的添加工作,如圖1.17所示。當(dāng)在進(jìn)行這個操作時要注意,在三維空間中新添加了網(wǎng)格之后,場景(Scene)視圖中發(fā)生的變化,同時也要注意到這個網(wǎng)格的名稱也出現(xiàn)在了層次(Hierarchy)面板的列表中。圖1.17將網(wǎng)格資源從項目(Project)面板中拖動到場景視圖中至此,現(xiàn)在項目(Project)面板上的網(wǎng)格資源已經(jīng)被實例化為一個場景中的物體。這意味著一個項目(Project)面板上的副本已經(jīng)作為一個獨立的游戲?qū)ο蠹尤氲搅藞鼍爸?。地面的實例(或者對象)依附于項目(Project)面板中的“floor”資源。但是反過來,這些資源卻并不依附這些實例。這意味著當(dāng)在場景中刪除這些實例(或者游戲?qū)ο螅r,這些資源并不會被刪除。反之,當(dāng)刪除了這些資源時,場景中的這些實例就會被刪除。如果場景中需要更多的地面,就可以多次從項目(Project)面板中向場景(Scene)視圖拖動“floor”資源。每進(jìn)行一次這種操作,都會在場景中添加一個單獨的游戲物體。雖然這些游戲物體都依附于同一個“floor”資源,但是它們相互之間都是獨立的(見圖1.18)。圖1.18向場景中添加多個“floor”網(wǎng)格實際上,并不需要這么多重復(fù)的地面,所以先把它們刪除。刪除這些地面的方法是先在場景(Scene)視圖中逐個單擊這些“floor”對象,然后在鍵盤上按下刪除鍵。另外記住,也可以通過單擊層次(Hierarchy)面板上這些游戲物體的名字,然后按下刪除鍵。不管使用的是哪一種方法,如今在場景中都只剩下了唯一一個“floor”對象。現(xiàn)在還有一個問題,那就是這個“floor”對象的名字問題。在層次(Hierarchy)面板上可以清楚地看到這個“floor”對象的名字是“FloorPrototype64x01x64”,這個名字很長,意義又不夠明確,而且調(diào)用的時候又不方便。因此應(yīng)該將這個名字改為一個更容易管理的,而且意義更明確的,這樣才能使工作更加有條理,也更容易管理。Unity中有很多種可以將對象重命名的方法,首先選中對象,然后在其檢查(Inspector)面板中的名稱字段處輸入新的名字。這里將這個對象重命名為“WorldFloor”,如圖1.19所示。圖1.19對“floor”網(wǎng)格進(jìn)行重命名1.5變換和導(dǎo)航到現(xiàn)在為止,一個地面網(wǎng)格已經(jīng)建立好了,但是僅僅這一個游戲?qū)ο筮€是很無趣的,還需要向其中添加更多的內(nèi)容,例如建筑物、樓梯、柱子或者更多的地面。否則,玩家在這個游戲中就沒有能進(jìn)行探索的世界了。在開始創(chuàng)建之前,首先要先確認(rèn)現(xiàn)在的地面處在了整個世界的中心位置。場景中的任何一個位置都有一個唯一的坐標(biāo),這個坐標(biāo)(x,y,z)值指的是距離世界中心點(原點)的距離。在檢查(Inspector)面板中可以看到當(dāng)前選中對象的坐標(biāo)。事實上,在Unity中,一個對象的位置(Position)、角度(Rotation)和尺寸(Scale)同屬于一個名為變換(Transform)的類別。位置表示的是一個對象距離3個坐標(biāo)軸的距離。角度表示一個對象繞著它的中心軸旋轉(zhuǎn)的角度。尺寸表示一個對象應(yīng)該縮小到多小或者擴大到多大。默認(rèn)的尺寸指的就是對象正常的大小,尺寸為2表示擴大到原來兩倍的大小,尺寸為0.5表示縮小到原來的一半,以此類推。這樣,一個對象的位置、角度、尺寸共同構(gòu)成了它的變換屬性。如果想改變一個選定對象的位置,可以在x、y和z位置字段輸入新的值。例如將一個對象移動到游戲世界的中心,就可以輸入(0,0,0),如圖1.20所示。圖1.20將一個對象移動到游戲世界的中心點如上所示,通過輸入適當(dāng)?shù)闹?,?dāng)然這個值要在系統(tǒng)許可的范圍內(nèi),就可以為對象指定準(zhǔn)確的位置。不過,使用鼠標(biāo)來直接移動對象往往更為直觀?,F(xiàn)在就來完成這個操作,首先添加第二個floor對象,這個floor對象的位置要遠(yuǎn)離第一個floor對象。先從項目(Project)面板上拖曳一個floor對象到場景中,然后單擊這個新的floor場景以選中它,然后按下鍵盤上的“W”鍵,或者單擊編輯器界面頂端的變換工具圖標(biāo)來切換到變換工具。變換工具允許對場景中的對象進(jìn)行重新定位,如圖1.21所示。圖1.21打開變換工具當(dāng)選定一個游戲?qū)ο?,并且打開變換工具以后,一個標(biāo)識(Gizmo)就出現(xiàn)在游戲?qū)ο蟮闹行牟糠?,在場景(Scene)選項卡中可以看到標(biāo)識(Gizmo)其實是由3個不同顏色的彩色軸組成的。其中,紅顏色的軸代表x軸,綠顏色的軸代表y軸,藍(lán)顏色的軸代表z軸。如果想移動一個游戲?qū)ο?,首先要將光?biāo)懸停在這3個軸中的一個軸(或者兩個軸之間的平面)上面,然后單擊并按住鼠標(biāo),同時向目標(biāo)方向拖動??梢苑磸?fù)地進(jìn)行這個操作,將游戲?qū)ο笠苿拥街付ǖ奈恢谩,F(xiàn)在就用這個方法來拖動第二個floor對象,使其遠(yuǎn)離第一個floor對象,如圖1.22所示。圖1.22使用標(biāo)識(Gizmo)來完成對一個游戲?qū)ο蟮淖儞Q操作也可以使用鼠標(biāo)來完成對游戲?qū)ο蟮霓D(zhuǎn)動和縮放。在鍵盤上按下“E”鍵可以啟動旋轉(zhuǎn)工具,按下“R”鍵可以啟動縮放工具,或者也可以在編輯器界面的上方單擊它們對應(yīng)的工具欄圖標(biāo)來啟動這些工具。當(dāng)工具啟動之后,一個標(biāo)識(Gizmo)就出現(xiàn)在這個對象的中心部分,可以通過單擊和拖動鼠標(biāo)來將這個對象旋轉(zhuǎn)到指定角度,或者縮放到指定尺寸,如圖1.23所示。圖1.23旋轉(zhuǎn)和縮放工具的選擇在Unity中進(jìn)行開發(fā)時,使用鍵盤和鼠標(biāo)對物體進(jìn)行快速的移動、旋轉(zhuǎn)和縮放是非常重要的。所以,最好習(xí)慣使用鍵盤的快捷鍵來完成這些操作,而不是總用鼠標(biāo)去單擊工具欄。不過,除了要對游戲?qū)ο筮M(jìn)行移動、旋轉(zhuǎn)和縮放以外,可能還需要頻繁地變換自己的視角,這樣才能從不同的位置、角度和視角對這個世界進(jìn)行觀察。這意味著必須要經(jīng)常改變場景中的攝像機。當(dāng)要看清楚一個游戲?qū)ο髸r,就會需要進(jìn)行放大或縮小的操作。如果想準(zhǔn)確地將游戲?qū)ο髮R并結(jié)合在一起,就需要改變觀察的視角。如果想完成這些操作,就需要充分地將鼠標(biāo)和鍵盤結(jié)合在一起使用。如果想靠近或者遠(yuǎn)離正在觀察的對象,只需要向上或者向下滑動鼠標(biāo)滾輪,就可以實現(xiàn)放大或者縮小目標(biāo)對象,過程如圖1.24所示。圖1.24放大或者縮小操作按住鼠標(biāo)的中鍵然后將鼠標(biāo)向適當(dāng)?shù)姆较蛞苿?,如向上移動,這樣就可以將場景(Scene)視圖向上移動。同樣,向另外3個方向移動鼠標(biāo)也可以將場景(Scene)視圖向這3個方向移動?;蛘咭部梢栽趹?yīng)用工具欄中(或者使用鍵盤上的Q快捷鍵)激活移動工具,如圖1.25所示。當(dāng)這個移動工具處于激活狀態(tài)的時候,就可以十分簡單地單擊并拖動整個場景(Scene)視圖。注意,這個操作并不會改變場景的大小,而只是沿著向左、向右或者向上、向下的方向滑動攝像機。圖1.25激活移動工具有時在構(gòu)建關(guān)卡時,可能會找不到所需要的對象。例如,此時攝像機可能正在關(guān)注一個與目標(biāo)完全不同的地方,這個地方并不是所要單擊或者看到的。如果遇到了這種情況,必須要改變相機的視角來找到目標(biāo)對象。如果將這個目標(biāo)對象處在整個場景的中心,就必須不斷地進(jìn)行改變位置和旋轉(zhuǎn)視圖的操作。但是如果要自動地完成這一切,可以有一種更簡單的方法,那就是從層次(Hierarchy)面板上選中這個對象的名字。然后,按下鍵盤上的“F”鍵,也可以直接在層次(Hierarchy)面板上直接雙擊來完成這個操作,如圖1.26所示。圖1.26一個選定的對象當(dāng)選中了一個游戲?qū)ο笾?,可能會?jīng)常性地對這些對象進(jìn)行旋轉(zhuǎn)操作,以便能從所有的重要視角來對其進(jìn)行查看,只需要單擊鼠標(biāo),并在拖動的同時按住鍵盤上的“Alt”鍵,就可以完成視角的轉(zhuǎn)動,如圖1.27所示。圖1.27繞著一個選中的游戲?qū)ο筮M(jìn)行旋轉(zhuǎn)最后,在場景(Scene)視圖中使用第一人稱視角控制是十分實用的,像在玩一款第一人稱視角的游戲一樣,這將有助于你以一種身臨其境的方式來體驗整個現(xiàn)場。如果想實現(xiàn)這個功能,可以在按下鼠標(biāo)右鍵的同時使用鍵盤上的“W”“A”“S”“D”來控制前進(jìn)、后退或者左右轉(zhuǎn)動。使用鼠標(biāo)來控制頭的方向。另外,還可以在運動的同時按下“Shift”鍵來提高運動的速度,如圖1.28所示。圖1.28使用第一人稱視角控制這里之所以選擇對各種進(jìn)行變換和導(dǎo)航控制的方法進(jìn)行學(xué)習(xí),就在于掌握了這些知識之后,你就可以以任何方式來定位和移動目標(biāo)對象,也可以從任何的位置和角度來查看整個世界。如果想快速地建立一個高品質(zhì)的游戲關(guān)卡,做到這一點是十分重要的。所有的這些以及一些其他的控制方式都將貫穿于這本書的場景創(chuàng)建和Unity開發(fā)之中。1.6場景的建立現(xiàn)在已經(jīng)成功地實現(xiàn)了對象的屬性變換和在場景視圖中的導(dǎo)航。接下來可以開始完成金幣采集游戲的第一個關(guān)卡了。首先將空間中的兩個floor網(wǎng)格對象分開,在它們之間留一個大的裂縫,將來會在這個裂縫上創(chuàng)建一個橋梁。玩家將可以通過這個橋梁往返于兩個如同島嶼一樣的floor網(wǎng)格對象之間??梢允褂米儞Q(Translate)工具(W)來移動物體,如圖1.29所示。圖1.29將兩個floor網(wǎng)格對象分隔成獨立的島嶼如果創(chuàng)建更多的floor對象,可以使用之前用過的方法,從項目(Project)面板處拖動一個網(wǎng)格資源到場景視圖中。另外,也可以將在場景視圖中選中的對象進(jìn)行復(fù)制,復(fù)制的方法是在選中目標(biāo)對象之后,同時按下鍵盤上的“Ctrl+D”組合鍵,這兩種方法都可以達(dá)到目的。接下來,要向場景中添加一些道具(Props)和障礙物(Obstacles),首先向floor網(wǎng)格對象上添加一些房屋(House)對象,可以按照“Assets|StandardAssets|Prototyping|Prefabs”這個目錄找到房屋對象(HousePrototype16x16x24),如圖1.30所示。圖1.30向場景中添加房屋道具當(dāng)將一個房屋拖動到場景中之后,這個房屋可能會與地面的底部完美的對齊,但是也有可能不會,如果對齊了,那你的運氣還真是不錯。但是我們不可能每次都有這么好的運氣,一個專業(yè)的游戲開發(fā)者應(yīng)該依靠自身的技能,而不是運氣。不過別擔(dān)心,在Unity中,可以輕松地使用頂點捕捉(VertexSnapping)來將任意的兩個網(wǎng)格對象進(jìn)行對齊。這個功能的工作原理是使兩個游戲中的對象通過將它們的頂點定位到同一個位置來實現(xiàn)對齊操作。這里以圖1.31為例,在這張圖中房子歪歪扭扭地坐落在floor對象之上,我們很自然地希望將它和floor對象進(jìn)行水平對齊或者角對齊。要實現(xiàn)這個效果,我們首先要選擇房子(House)對象,這一點可以通過單擊或者在層次面板中選擇這個對象來完成,要注意進(jìn)行選中操作的應(yīng)該是要移動的那個對象,而不是那個用來對齊的參照物(此處特指floor對象)。圖1.31使用頂點捕捉(VertexSnapping)來對沒有對齊的物體進(jìn)行調(diào)整接下來,激活變換工具(W),并且按下鍵盤上的“V”鍵,同時移動光標(biāo),觀察選中網(wǎng)格中最近頂點的標(biāo)識(Gizmo)光標(biāo),如圖1.32所示。Unity會要求選擇一個進(jìn)行捕捉操作的源頂點。圖1.32按下“V”鍵來激活頂點捕捉(VertexSnapping)按下鍵盤上的“V”鍵,同時把光標(biāo)移動到房屋底部角的位置,然后單擊并從角拖動到floor網(wǎng)格的角。然后房屋將會完成與floor網(wǎng)格角對角的頂點捕捉對齊,當(dāng)完成了這種對齊之后,釋放“V”鍵,此時兩個網(wǎng)格的頂點已經(jīng)對齊了,如圖1.33所示。圖1.33通過頂點對齊兩個網(wǎng)格現(xiàn)在,可以使用原型包(PrototypingPackage)中的網(wǎng)格資源來搭建一個完整的場景了。通過向場景中拖放一些道具,并使用變換、旋轉(zhuǎn)以及縮放操作,就可以實現(xiàn)對這些游戲?qū)ο蟮亩ㄎ弧⑴欧藕娃D(zhuǎn)動。使用頂點捕捉,可以按自己所愿將所有游戲?qū)ο筮M(jìn)行對齊。多練習(xí)一些這種操作,使用這些工具和資源可以完成圖1.34所示的場景安排。圖1.34構(gòu)建一個完整的關(guān)卡1.7光源和天空現(xiàn)在已經(jīng)完成關(guān)卡中基本建筑的模型導(dǎo)入和布局?jǐn)[放了,只使用很少的幾個網(wǎng)格資源和一些基本工具就完成了這些操作。不過,這些工具的功能卻是相當(dāng)強大的,將這些工具組合操作,可以讓游戲世界變得豐富多彩,甚至以假亂真。不過,這里還遺漏了一點很重要的事情,那就是光。仔細(xì)觀察圖1.34,這里所有的物體看起來都是單調(diào)的,沒有光亮、陰影。這是因為場景中并沒有配置合適的照明系統(tǒng),雖然在游戲創(chuàng)建的時候已經(jīng)默認(rèn)自帶了一個光源對象(Light),但是這個光源對象(Light)現(xiàn)在并沒有起什么作用?,F(xiàn)在這個場景中還沒有天空,接下來就為這個金幣采集游戲添加上一個天空(Sky)效果,單擊場景(Scene)視圖頂部工具欄的下拉菜單,然后從下拉菜單中選中“skybox”以啟用天空效果。這里的天空盒(Skybox)指的就是一個包圍了整個場景的大型立方體,這個立方體的每個內(nèi)部的側(cè)面都有一個貼圖(圖像),這些貼圖連續(xù)在一起,看起來就如同現(xiàn)實中的天空一樣。這里選用了“skybox”,就在場景(Scene)視圖中顯示了一個如圖1.35所示的默認(rèn)的天空。圖1.35啟用天空效果雖然天空效果的啟用使得整個場景看起來好多了,但是它卻仍然缺乏一個合適的照明系統(tǒng)。場景中的游戲?qū)ο笕狈饬梁完幱?,為了改善這一點,首先要打開場景(Scene)視圖上方(見圖1.36)的照明圖標(biāo)開關(guān),確保照明系統(tǒng)是啟用的。注意,這個開關(guān)只是決定照明系統(tǒng)是否在場景(Scene)視圖中起作用,而決定不了在最后的游戲中照明系統(tǒng)是否起作用。圖1.36在場景(Scene)視圖中啟用場景照明系統(tǒng)啟用了照明系統(tǒng)之后,就會明顯地看到場景與之前有了很大的差異,現(xiàn)在的場景看起來真實多了。也可以選擇層次(Hierarchy)面板上的“DirectionalLight”來進(jìn)行旋轉(zhuǎn)操作,以確定場景中的燈光效果。眾所周知,一天中的不同時間里,光線的強度和角度都是不同的,現(xiàn)在就可以利用這種操作來實現(xiàn)不同時間中光線的變化。這樣將會改變場景的渲染方式,如圖1.37所示。圖1.37轉(zhuǎn)動場景中的方向光(DirectionalLight)模擬一天中時間的變化如果要撤銷之前對方向光(DirectionalLight)做的任何操作,可以按下鍵盤上的“Ctrl+Z”組合鍵。為了做好最終及最佳的照明效果,需要把場景中所有不能移動的游戲?qū)ο螅ɡ鐗Ρ?、地板、桌子、椅子、天花板、草、山、塔等)都?biāo)記為靜態(tài)的。對于Unity來說,意味著標(biāo)記為靜態(tài)的游戲?qū)ο笤谡麄€的游戲過程中,無論發(fā)生什么,都是永遠(yuǎn)不會被移動的。通過將游戲?qū)ο髽?biāo)記為靜態(tài),就可以幫助Unity在對游戲渲染和照明處理時進(jìn)行優(yōu)化?,F(xiàn)在只需要在場景中選擇所有不能移動的對象(這包括了目前為止游戲中的所有對象),然后在對象的檢查(Inspector)面板中選中靜態(tài)(Static)復(fù)選框。注意,無需分別地設(shè)置靜態(tài)屬性。在為多個對象設(shè)置靜態(tài)屬性時,只需要在選擇這些對象的,同時按下Shift鍵就能選中所有對象,然后就可以一次性地在對象的檢查(Inspector)面板中為這些對象設(shè)置屬性,如圖1.38所示。圖1.38為多個不能移動的對象設(shè)置靜態(tài)選項以改善照明和系統(tǒng)性能當(dāng)為一個幾何圖形的游戲?qū)ο蠊催x了靜態(tài)(Static)復(fù)選框之后,Unity將會自動為場景中的光線效果進(jìn)行計算,這些效果包括陰影、間接照明等。通過計算得到了一些被稱為“GI緩存”的數(shù)據(jù),這些數(shù)據(jù)中包含了光的傳播路線,向Unity指示了光線應(yīng)該如何在場景中進(jìn)行傳播和反射,才能更真實地模擬現(xiàn)實世界。即便如此,之前勾選了靜態(tài)復(fù)選框的游戲?qū)ο筮€是沒有陰影,這將使游戲看起來很不真實。產(chǎn)生這種情況的原因是大部分的網(wǎng)格對象都有一個產(chǎn)生陰影(CastShadows)的選項,而這個選項默認(rèn)是禁用的?,F(xiàn)在來消除這個缺陷,首先選中場景中的所有網(wǎng)格對象,然后在檢查(Inspector)面板上單擊“MeshRenderer”組件并選中“CastShadows”復(fù)選框,當(dāng)完成這個操作后,所有的網(wǎng)格對象就有如圖1.39所示的陰影效果了。圖1.39從“MeshRenderer”組件上啟用陰影效果現(xiàn)在的網(wǎng)格對象都已經(jīng)產(chǎn)生了陰影,下面就此開發(fā)過程做個小結(jié)。到目前為止,已經(jīng)創(chuàng)建了一個新的Unity項目,使用網(wǎng)格對象填充了整個游戲場景,而且使用方向光(DirectionalLight)成功地完成了對場景的照明。如果使用第一人稱視角模式在這個游戲環(huán)境中進(jìn)行一番游歷,那將會是非常棒的體驗。好了,我們來看看接下來的操作吧!1.8游戲測試與游戲選項卡至此,已經(jīng)使用Unity自帶原型包(PrototypingPackage)完成了金幣采集游戲環(huán)境的構(gòu)建?,F(xiàn)在的游戲環(huán)境包含了兩個主要的島嶼,島嶼上有一些建筑物,兩個獨立的島嶼通過一個石橋連接在一起,如圖1.40所示??赡苣愕牟季峙c圖1.40看起來有一些不同,不過也是非常不錯的。圖1.40目前已經(jīng)包含了兩個島嶼區(qū)域的場景總的來看,場景還是完成得不錯,現(xiàn)在需要把這個場景保存一下??梢赃x擇按下鍵盤上的“Ctrl+S”組合鍵,或者也可以如圖1.41所示,從應(yīng)用程序菜單上選擇“File|SaveScene”選項。如果是第一次對場景進(jìn)行保存,Unity會彈出一個“Save”對話框,提示為這個場景起一個名字(這里本書將這個場景起名為“l(fā)evel__01”)。圖1.41對場景進(jìn)行保存完成這個場景的保存之后,它就成為了當(dāng)前項目的場景資源,同時也如圖1.42一樣出現(xiàn)在了項目(Project)面板中。這意味著當(dāng)前的場景已經(jīng)不再像以前是一個臨時拼湊在一起的組合了,而是一個真正不可分割的整體。注意,對一個場景進(jìn)行保存與對一個項目進(jìn)行保存并不一樣,比如在應(yīng)用程序菜單上就分別有“SaveScene”和“SaveProject”兩個不同的選項。記住,一個項目是一些文件和文件夾的集合,它包含了游戲中的場景和資源。相比之下,一個場景是項目中的一個資源,外觀就像是一個完整的3D地圖。這個場景中包含了很多網(wǎng)格、紋理和聲音。因此,保存一個項目是指將包括場景在其中的各種文件和資源的配置進(jìn)行保存。而對場景的保存,只是將指定場景中關(guān)卡的變化進(jìn)行保存。圖1.42保存的scenes被作為資源添加到項目中從圖1.42可以看出,已經(jīng)將場景保存到了一個名為“scenes”的文件夾中??梢栽陧椖浚≒roject)面板上的任意空白區(qū)域單擊鼠標(biāo)右鍵來為自己的項目創(chuàng)建一個文件夾。另外,依次單擊應(yīng)用程序菜單上的“Assets|Create|Folder”,就可以輕易地使用鼠標(biāo)拖放來完成對文件夾中的資源進(jìn)行移動操作?,F(xiàn)在的這個關(guān)卡中并沒有任何可以玩的東西。它只是一個使用編輯器開發(fā)出來的靜止的、了無生趣的且與外界毫無交互行為的三維環(huán)境?,F(xiàn)在給游戲添加可玩性,允許玩家通過控制鍵盤上的“W”“A”“S”“D”以第一人稱視角的方式在這個游戲世界中進(jìn)行環(huán)游和探索。為了實現(xiàn)這個目標(biāo),需要向場景中添加一個第一人稱視角角色控制器(First-personCharacterController),它是Unity中自帶的資源,本身已經(jīng)包含了實現(xiàn)第一人稱視角角色控制的所有功能。依次打開“StandardAssets|Characters|FirstPersonCharacter|Prefabs”文件夾,然后從項目(Project)面板拖動“FPSController”資源到場景中,如圖1.43所示。圖1.43向場景中添加第一人稱視角角色控制器當(dāng)添加了第一人稱視角角色控制器以后,就可以單擊Unity工具欄上的“Play”按鈕以第一人稱視角模式來進(jìn)行游戲,如圖1.44所示。圖1.44單擊工具欄上的“Play”按鈕對Unity中的場景進(jìn)行測試按下“Play”按鈕之后,Unity就可以從場景(Scene)選項卡切換到游戲(Game)選項卡,正如所看到的,場景(Scene)選項卡是以一個開發(fā)者的視角來觀看整個場景的,此時可以對場景進(jìn)行編輯、制作和設(shè)計。相比之下,游戲(Game)選項卡是以一個游戲者的視角來查看整個場景的,只能進(jìn)行游戲和測試。在游戲者的視角中,只能從主攝像機的角度來查看所有的場景。當(dāng)激活了游戲(Game)選項卡,并啟動“Play”模式后,可以使用游戲默認(rèn)的控制方式開始這個游戲的測試工作。第一人稱視角控制器使用鍵盤上的“W”“A”“S”“D”4個鍵來控制運動,使用鼠標(biāo)來控制視角,如圖1.45所示。圖1.45在游戲(Game)選項卡中完成對關(guān)卡的測試即使處于“Play”模式中,也可以隨時切換到場景(Scene)選項卡中,甚至可以對場景進(jìn)行編輯和修改,對場景中的對象進(jìn)行移動和刪除。但是要注意的是,所有,在“Play”模式期間進(jìn)行的改動,在“Play”模式結(jié)束之后都會自動復(fù)原,也就是這些改動都不會被保留。這是一種特意的設(shè)計,它允許在游戲過程中對屬性進(jìn)行編輯,從而可以觀察產(chǎn)生的影響,并對問題進(jìn)行調(diào)試,但是卻并不真正地對場景進(jìn)行改動?,F(xiàn)在的關(guān)卡中已經(jīng)可以實現(xiàn)以第一人稱視角模式行走了。當(dāng)結(jié)束游戲時,可以再一次單擊“Play”按鈕,或者按下鍵盤上的“Ctrl+P”組合鍵,之后就返回到場景(Scene)選項卡中了。Unity中還提供了用來暫停和恢復(fù)游戲的“Toggle-Pause”按鈕。到現(xiàn)在為止,你應(yīng)該已經(jīng)注意到了,當(dāng)在關(guān)卡中以第一人稱視角控制器進(jìn)行游戲的時候,在下面的控制臺(Console)窗口中不斷地輸出一些信息。默認(rèn)情況下,這個窗口位于Unity編輯器的下方,就在項目(Project)面板旁邊,也可以通過在菜單欄上依次選中“Window|Console”人為地打開這個窗口??刂婆_(Console)窗口會將所有遇到的錯誤或者警告以消息的形式顯示出來。錯誤都會以紅顏色標(biāo)記,警告都會以黃顏色進(jìn)行標(biāo)記,而普通的信息則會以默認(rèn)的灰色顯示。有時,一條消息只會顯示一次,而有時卻會顯示很多次,如圖1.46所示。圖1.46控制臺(Console)窗口輸出信息、警告和錯誤正如之前提到過的,在控制臺(Console)窗口中可以輸出3種不同類型的消息:信息、警告和錯誤。信息是指基于當(dāng)前工作的項目給出的最佳建議和意見。警告是指在代碼或者場景中出現(xiàn)了一些不太嚴(yán)重的問題,如果不改正,則可能會導(dǎo)致游戲中出現(xiàn)意想不到的行為以及不佳的游戲性能。錯誤消息描述了需要立即引起注意的代碼和場景中的錯誤。有時,這些錯誤導(dǎo)致游戲根本無法工作,或者在運行的時候發(fā)生錯誤,從而引起游戲崩潰或者失去響應(yīng)。此時控制臺(Console)窗口就顯得十分有用了,因為它可以實現(xiàn)對游戲進(jìn)行調(diào)試。圖1.46中就給出了一個關(guān)于“AudioListener”重復(fù)的問題?!癆udioListener”是一個連接到攝像機對象的組件。默認(rèn)情況下,每一個攝像機都有一個“AudioListener”組件,它像是一個耳朵,在攝像機所在的位置接收場景中的各種聲音。但是,Unity中并不支持在同一場景中使用多個處于激活狀態(tài)的“AudioListener”。這也就意味著在同一地點同一時間只能聽到一個聲音。那么問題就產(chǎn)生了,因為現(xiàn)在的場景中已經(jīng)包含了兩個攝像機,其中一個是在創(chuàng)建場景時自動產(chǎn)生的,另外一個是添加的第一人稱視角控制器中自帶的。若想確認(rèn)這一點,只需要在層次(Hierarchy)面板上選中第一人稱視角控制器對象,之后單擊它名字旁邊的三角形圖標(biāo),這樣就會在這個物體的下方顯示更多的對象,這些對象都是第一人稱視角控制器的組成部分,如圖1.47所示。圖1.47找到第一人稱視角控制器中的攝像機選中位于“FPSController”下方展開之后顯示的“FirstPersonCharacter”對象,如圖1.47所示?!癋irstPersonCharacter”對象是“FPSController”對象的一個子對象。這一點從層次(Hierarchy)面板上的“FPSController”中包含了“FirstPersonCharacter”就可以看出來。子對象會繼承它們上一級對象的變換(Transformation)屬性。這表示當(dāng)在場景中對某些對象進(jìn)行移動或者旋轉(zhuǎn)操作時,所做的變換同樣會影響到它的所有子對象。在檢查(Inspector)面板中,可以看到這個對象包含一個“AudioListener”組件,如圖1.48所示。圖1.48包含了“AudioListener”組件的第一人稱視角控制器游戲?qū)ο笠部梢赃x擇將“AudioListener”組件從FPSController對象上移除,但是這樣做,游戲者在以第一人稱視角進(jìn)行游戲時就再也聽不到聲音了。所以,選擇將場景創(chuàng)建之初自帶的攝像機刪除。只需要在層次(Hierarchy)面板上選中圖1.49所示的攝像機,然后按下鍵盤上的“Delete”鍵即可完成刪除操作。這樣就可以消除在游戲進(jìn)行時產(chǎn)生的關(guān)于“AudioListener”的警告?,F(xiàn)在可以開始游戲的試玩了!圖1.49刪除攝像機對象1.9添加一個水平面到目前為止,游戲已經(jīng)取得了不錯的進(jìn)展,已經(jīng)可以以第一人稱視角的模式在整個游戲環(huán)境中行走和探索了。不過,這個游戲環(huán)境還有很多值得改進(jìn)的地方。例如,floor網(wǎng)格現(xiàn)在就如圖1.50所示的那樣孤零零地懸浮在游戲世界的空中,沒有任何的支撐。更離譜的圖1.50整個世界地面懸浮在空中,沒有任何的支撐是,當(dāng)走出了地面邊緣的時候,就會掉下一個無底的深淵。所以現(xiàn)在需要在地面下面添加一片水域,這樣場景的環(huán)境就更加完整了。為了向這個游戲中添加水資源,可以使用另一種Unity中預(yù)置的資源。在項目(Project)面板中依次打開“StandardAssets|Environment|Water|Water|Prefabs”文件夾,然后將“WaterProDaytime”資源從項目(Project)面板中拖動到場景中,如圖1.51所示,這是一個圓形的對象,但是實際上的尺寸比所需要的小得多。圖1.51向環(huán)境中添加水資源在向場景中添加了水資源預(yù)設(shè)體(Prefab)之后,將其放置在地平面的下面,然后使用“Scale”工具(R)來變大水資源預(yù)設(shè)體(Prefab)的平面(X,Z)大小,一直擴大到遙遠(yuǎn)的地平線為止。這樣就使得地面網(wǎng)格看起來好像是一望無際的大海之中的一個小孤島,完成后的效果如圖1.52所示。圖1.52環(huán)境中水資源面積的調(diào)整以及最后的大小現(xiàn)在,在一個游戲(Game)選項卡中開始另一個測試。在工具欄上按下“Play”按鈕,然后以第一人稱視角模式來完成角色的導(dǎo)航。如圖1.53所示,可以看到關(guān)卡中的水面,當(dāng)然,在水面上是無法行走的,同樣也不能在這里面游泳和潛水。如果真的走到了水面上,就會掉進(jìn)去,好像這些水根本就不存在一樣?,F(xiàn)在的水只是一個裝飾,僅僅起了一個使場景看起來更真實的作用。圖1.53以FPS模式對有水的環(huán)境進(jìn)行測試現(xiàn)在場景中的水是虛無縹緲的,看得見卻摸不著,但玩家可以輕易地從這些水中穿過,就好像它們是不存在的一樣。Unity現(xiàn)在并不會將這些水當(dāng)作固態(tài)或者半固態(tài)的物體來對待。通過給物體添加上一個盒子碰撞體(BoxCollider)組件,就可以使其具有固體的性質(zhì),關(guān)于碰撞體(Collider)和物理屬性(Physics)的內(nèi)容,將會在第3章中進(jìn)行更詳細(xì)的講解?,F(xiàn)在,簡單快速地給場景中的水對象添加上一個固體的屬性,只需要在層次(Hierarchy)面板上將水對象選中,然后再在應(yīng)用程序菜單上依次選中“Component|Physics|BoxCollider”,如圖1.54所示。向一個選中的對象上添加一個組件會改變這個對象本身的表現(xiàn)。即便如此,也千萬不要有添加越多組件,對象越完美的錯誤觀點。其實應(yīng)該在保證功能的前提下,為一個對象添加盡量少的附件,這種策略可以使工作流變得簡單、整潔,并具有更好的性能優(yōu)化。圖1.54向水資源對象添加一個盒子碰撞體(BoxCollider)當(dāng)向水資源中添加了一個盒子碰撞體(BoxCollider)之后,就會在網(wǎng)格周圍出現(xiàn)一個綠色的籠狀網(wǎng)格。這個綠色的籠狀網(wǎng)格大概表示了水資源對象的體積和形狀,也就是說Unity認(rèn)為這個區(qū)域就是一個固體,如圖1.55所示。圖1.55盒子碰撞體(BoxCollider)的近似體積現(xiàn)在當(dāng)控制游戲中的角色走到水面上去時,就會發(fā)現(xiàn)角色會在水面上移動,而不會掉下去。當(dāng)然,更真實的效果應(yīng)該是這個角色能在水中游泳,雖然現(xiàn)在的“水上漂”有點假,總比掉下去要好多了。想讓角色能在水中像真的一樣游泳,需要更多的工作,這里暫不涉及。如果需要將盒子碰撞體的功能從水中去掉,返回到初始的虛無狀態(tài),則首先選中水對象,然后單擊它的“BoxCollider”組件右上方的齒輪圖標(biāo),然后選中下面菜單中的“RemoveComponent”選項,如圖1.56所示。圖1.56移除一個組件1.10添加一個用來采集的金幣至此,該游戲已經(jīng)有了很多功能,例如一個完整的環(huán)境、一個第一人稱視角控制器、一片大海。不過,本章設(shè)計的是一個金幣采集游戲,但是現(xiàn)在這個游戲場景中還沒有任何可以采集的金幣。為了實現(xiàn)這些功能,需要編寫一些C#腳本,這些腳本要到下一章才會看到。然而可以創(chuàng)建一些金幣對象,如將一個圓柱體(Cylinder)對象變形成一個金幣。下面先來創(chuàng)建一個圓柱體對象,操作方法是從應(yīng)用程序菜單處依次選擇“GameObject|3DObject|Cylinder”,如圖1.57所示。圖1.57創(chuàng)建一個圓柱體(Cylinder)對象最初,這個圓柱體(Cylinder)對象看起來一點也不像是一個金幣。不過它的外形是很容易改變的,只需要按著Z軸將圓柱體(Cylinder)變薄即可。切換到“Scale”工具(R),然后向內(nèi)減小圓柱體(Cylinder)的長度,如圖1.58所示。圖1.58將圓柱體(Cylinder)對象變成一個金幣形狀在改變了金幣的大小和形狀之后,它自帶的碰撞體的大小與金幣的體積就完全不一樣了。碰撞體的體積要比金幣大很多,如圖1.58所示。默認(rèn)情況下,圓柱體(Cylinder)自帶的是一個膠囊型(Capsule)碰撞體,而不是之前見過的盒狀碰撞體??梢栽诮饚疟贿x中之后,從檢查(Inspector)面板處來改變“Radius”屬性的值,這將改變膠囊碰撞體(CapsuleCollider)的大小,如圖1.59所示。將這個值調(diào)小,使得膠囊碰撞體的大小與金幣更加接近?;蛘?,選擇將膠囊碰撞體(CapsuleCollider)完全刪除,然后再添加一個盒子碰撞體(BoxCollider)來代替。這兩種方法都是可行的,可以根據(jù)實際情況進(jìn)行選擇。在下一章的代碼中將會使用到碰撞體,它將用來檢測玩家與金幣之間的接觸。圖1.59調(diào)整金幣的膠囊碰撞體(CapsuleCollider)尺寸至此,已經(jīng)將金幣的形狀和結(jié)構(gòu)設(shè)計好了。接下來的一章還要對金幣很多方面進(jìn)行改進(jìn)。例如,需要給金幣添加一個有金屬光澤的外觀,還要使這個金幣可以被采集。本章僅僅使用了Unity自帶的基本工具,就產(chǎn)生了一個形狀看起來很像金幣的對象。1.11小結(jié)現(xiàn)在已經(jīng)為金幣采集游戲的開發(fā)打下了良好的基礎(chǔ),關(guān)于這個游戲的功能部分將會在下一章中完成和實現(xiàn)?,F(xiàn)在,讀者已經(jīng)掌握了如何從零開始創(chuàng)建一個Unity項目,并使用網(wǎng)格、貼圖和場景來充實這個項目。另外,讀者也已經(jīng)了解了如何為游戲創(chuàng)建一個場景,以及如何使用各種資源來完善游戲的功能。這些資源包括水、第一人稱視角控制器和原型資源庫等。在下一章中,將為金幣添加可采集的特性,并為游戲添加一系列的邏輯,使得游戲有輸或者贏的結(jié)局。
第2章金幣采集游戲(Ⅱ)這一章將會在第1章建立好的游戲基礎(chǔ)上繼續(xù)進(jìn)行。在這個金幣采集游戲中,玩家可以第一人稱視角模式在整個游戲環(huán)境中進(jìn)行漫游,在游戲規(guī)定時間到達(dá)之前,尋找并采集到所有的金幣。如果在游戲規(guī)定時間結(jié)束前,玩家就已經(jīng)完成了所有金幣的采集工作,則視為游戲勝利。反之,如果到游戲規(guī)定時間結(jié)束時,玩家并沒有完成所有金幣的采集工作,則視為游戲失敗。到目前為止,已經(jīng)在這個項目中添加了一個完整的環(huán)境,環(huán)境中包括地面、道具、水、一個第一人稱視角的控制器,及一個看起來已經(jīng)具有金幣形狀但還不能被采集的金幣對象。本章繼續(xù)完善這個游戲,最后將實現(xiàn)金幣可以被玩家采集,系統(tǒng)中還有一個可以檢測游戲進(jìn)行時間的計時器。從本質(zhì)上來說,這一章中的主要工作是為游戲添加邏輯和規(guī)則。為了實現(xiàn)這一目標(biāo),需要使用C#編寫一些代碼,所以本章的學(xué)習(xí)需要對編程有一些基礎(chǔ)。這本書主要是Unity的功能介紹以及如何使用Unity游戲開發(fā)引擎,但是程序的編寫并不在本書的范圍內(nèi),因此,假設(shè)本書的讀者已經(jīng)有了編寫代碼的能力??傮w而言,本章將涉及的主題如下:材質(zhì)(Material)的制作預(yù)設(shè)體(Prefab)使用C#進(jìn)行游戲編程腳本文件的編寫使用粒子(Particle)系統(tǒng)游戲的構(gòu)建和編譯2.1創(chuàng)建一個金幣的材質(zhì)在上一章結(jié)束時,通過將一個初始的圓柱形(Cylinder)對象進(jìn)行不均勻的縮放,從而產(chǎn)生了一個基本的金幣對象。依次單擊應(yīng)用程序菜單上的“GameObject|3DObject|Cylinder”可以創(chuàng)建該對象,結(jié)果如圖2.1所示。從概念上來說,金幣對象是游戲邏輯中的一個基本單位,玩家在游戲時間耗盡之前要盡力地去采集這些金幣。這意味著這些金幣并不能僅僅是被看到就行了,其主要目的是實現(xiàn)游戲的功能,玩家是否收集到了金幣將意味不同的游戲結(jié)果。因此,現(xiàn)在的金幣對象還缺少兩個重要的方面。首先,這個金幣看起來很陰暗,而且顏色還是灰色的,它完全無法吸引玩家的注意力。再者,這個金幣對象無法被玩家采集。不過,玩家可以穿過金幣,就好像什么都沒有發(fā)生一樣。圖2.1到目前為止的金幣對象本章和下一章中講到的金幣采集游戲的完整項目程序可以在本書配套文件的Chapter02/CollectionGame文件夾中找到。這一節(jié)將集中講述如何使用材質(zhì)(Material)改善金幣的外觀。一個材質(zhì)其實就是一個算法(或者說指令集),它指定了金幣的外觀所呈現(xiàn)的樣式。一個材質(zhì)并不僅僅指物體在顏色方面看起來怎樣,它同樣定義了物體表面是光滑的還是粗糙的,光照射到物體上之后是發(fā)生鏡反射還是漫反射。這一點必須要搞清楚才能明白為什么貼圖和材質(zhì)是兩種不同的東西。貼圖是指一個加載到計算機存儲器中的圖像文件,可以通過它的UV貼圖將一個三維物體覆蓋上。相反的,材質(zhì)定義了一個或者多個貼圖是如何結(jié)合在一起,并應(yīng)用到了一個對象外觀的塑造上的。如果需要在項目中創(chuàng)建一個新的材質(zhì)資源,就可以在項目(Project)面板的空白位置單擊鼠標(biāo)右鍵,然后在彈出的上下文菜單中,選擇“Create|Material”,如圖2.2所示?;蛘咴趹?yīng)用程序菜單處依次選中“Assets|Create|Material”。圖2.2創(chuàng)建一個材質(zhì)有時一個材質(zhì)也可以被稱作“Shader”。如果需要,就可以使用著色器語言(ShaderLanguage)來創(chuàng)建一個自定義的材質(zhì)。當(dāng)然也可以使用Unity中自帶的一些插件,例如“ShaderForge”等。當(dāng)成功地創(chuàng)建了一個新的材質(zhì)之后,接下來就要給這個材質(zhì)起一個名字。此處將這個材質(zhì)命名為“mat_GoldCoin”。這個名字的前半部分為“mat”,這樣能讓大家一下子就知道這是一個材質(zhì)資源。現(xiàn)在只需要在文本編輯區(qū)域輸入新的名字,即可完成對這個材質(zhì)的重命名。以后也可隨時在這個材質(zhì)上雙擊鼠標(biāo),來完成對名字的修改,如圖2.3所示。圖2.3為一個材質(zhì)重命名接下來,如果還沒有選中這個材質(zhì)資源,那么就在項目(Project)面板上選中它,這時其所有屬性都會在對象檢查(Inspector)面板處顯示出來。這里的屬性數(shù)量很多。注意,可以在這個對象的Inspector面板底部看到這個材質(zhì)基于當(dāng)前設(shè)定的預(yù)覽圖,當(dāng)在檢查(Inspector)面板處修改了材質(zhì)設(shè)定,下面的預(yù)覽圖也會及時地根據(jù)調(diào)整進(jìn)行更新,如圖2.4所示。圖2.4從對象檢查(Inspector)面板處對材質(zhì)的屬性進(jìn)行修改下面為金幣創(chuàng)造一個金光閃閃的材質(zhì)。首先需要指定著色器(Shader)的類型,這是因為這個類型決定了其他可用的參數(shù)。著色器(Shader)的類型決定了系統(tǒng)將采用哪種算法來計算對象的陰影。有很多種類型供選擇,但是最經(jīng)常使用的類型就是“Standard”或者“Standard(Specularsetup)”。對于游戲中使用的金幣,可以將著色器(Shader)的類型設(shè)定為“Standard”,如圖2.5所示。圖2.5設(shè)定材質(zhì)的著色器(Shader)類型此時,在預(yù)覽(Preview)面板中顯示的是陰暗的灰色,這與所需要的相差太多了?,F(xiàn)在需要的是一個金色,首先指定反射(Albedo)的屬性。單擊反射(Albedo)右側(cè)的色板,然后會彈出一個顏色選擇器,在其中選出所需要的金色。這時,反射(Albedo)右側(cè)的色板也會實時根據(jù)材質(zhì)的變化更新,如圖2.6所示。圖2.6將反射(Albedo)的值指定金色現(xiàn)在,金幣的材質(zhì)比以前好多了,但是需要的游戲?qū)ο笫墙饚?,也就是說,它們看起來應(yīng)該是金光閃閃的。為了將這個效果添加到材質(zhì)庫中,可單擊并滑動對象檢查(Inspector)面板處“Metallic”屬性右側(cè)的滑動條,將值設(shè)定為1。這個值設(shè)為1表明會將材質(zhì)設(shè)定為一個金屬表面,而不是一個像布或者頭發(fā)之類的漫反射面。同樣,此時的預(yù)覽會如同圖2.7所示的一樣,及時地根據(jù)設(shè)定的更改進(jìn)行更新。圖2.7創(chuàng)建一個金屬材質(zhì)現(xiàn)在已經(jīng)創(chuàng)建好了一個新的金屬材質(zhì),可以在預(yù)覽窗口中看到它逼真的效果了。如果需要,還可以在預(yù)覽窗口中更改材質(zhì)預(yù)覽時的形狀。默認(rèn)的情況下,材質(zhì)是以一個球形展示出來的,不過也可以以其他的基本形狀來預(yù)覽,例如正方體、圓柱體、圓環(huán)等。這樣有助于在不同的條件下對材質(zhì)進(jìn)行預(yù)覽??梢酝ㄟ^單擊預(yù)覽面板上方的“幾何圖形”按鈕來更改對象的形狀(見圖2.8)。圖2.8對一個對象上的材質(zhì)進(jìn)行預(yù)覽當(dāng)為金幣準(zhǔn)備好了材質(zhì)之后,就可以通過拖動的方式將這個材質(zhì)直接應(yīng)用到場景中的網(wǎng)格上。先將做好的金幣材質(zhì)應(yīng)用到金幣上,從項目(Project)面板選中剛做好的材質(zhì),然后拖動到場景中的金幣對象上。當(dāng)將材質(zhì)拖動到金幣上釋放鼠標(biāo)時,金幣就呈現(xiàn)出金屬效果了。這個過程如圖2.9所示。圖2.9為金幣設(shè)置材質(zhì)我們已經(jīng)成功地為金幣添加材質(zhì)了,也可以通過在場景選中金幣對象來查看它所使用的材質(zhì)了。同樣,也可以從檢查(Inspector)面板窗口來查看“MeshRenderer”組件。當(dāng)使用攝像機時,“MeshRenderer”組件可以保證一個網(wǎng)格對象是可見的。組件“MeshRenderer”包含一個材質(zhì)(Materials)區(qū)域,該區(qū)域中列出了分配給這個對象的全部材質(zhì)。在材質(zhì)(Materials)區(qū)域選中材質(zhì)的名字之后,Unity就會自動地從項目(Project)面板上選中材質(zhì),這樣就可以快速簡單地對材質(zhì)進(jìn)行定位,如圖2.10所示,組件“MeshRenderer”列出了分配給一個對象的所有材質(zhì)。圖2.10組件“MeshRenderer”列出了分配給一個對象的所有材質(zhì)一個網(wǎng)格對象有時會擁有多個材質(zhì),對象的每一個面都分配不同的材質(zhì)。不過為了獲得最佳的游戲性能,最好在滿足需求的基礎(chǔ)上使用盡可能少的材質(zhì)。如果可能,盡量讓多個游戲?qū)ο蠖际褂猛粋€材質(zhì),這樣做可以很明顯地提高游戲的性能。如果想要獲得關(guān)于游戲渲染性能優(yōu)化方面的更多內(nèi)容,可訪問\hhttp://docs.U/Manual/OptimizingGraphicsPerformance.html的在線文檔。已經(jīng)完成可以用來收集的金幣的材質(zhì)了,它看起來很漂亮,不過,并沒有徹底地完成金幣部分。當(dāng)玩家接觸到金幣時,它并不會消失,而且也沒有機制來記錄玩家到底采集到了多少金幣。接下來就需要開始編寫程序了。2.2Unity中的C#腳本為游戲定義邏輯、規(guī)則和行為的時候,往往需要使用到腳本。如果想將那些靜態(tài)的、無生命的場景和對象轉(zhuǎn)換成為可以進(jìn)行交互的環(huán)境和對象,那么開發(fā)人員就需要編寫代碼。這些代碼定義了這些物體在遇到了指定情況之后,應(yīng)該做出什么樣的反應(yīng)。金幣采集游戲也需要編寫代碼才能實現(xiàn)所有的功能。這個游戲需要實現(xiàn)3個主要的功能:能夠感知玩家是否收集到金幣;在游戲進(jìn)行中,能夠及時了解到玩家收集的金幣數(shù)量;能確定游戲時間是否已經(jīng)結(jié)束。在Unity中并沒有包含一個能實現(xiàn)上述功能的模塊。所以必須自己來編寫一些代碼來實現(xiàn)這些功能。Unity中支持兩種語言,即UnityScript語言(有時候稱之為JavaScript語言)和C#語言。這兩種語言功能都很強大,但是本書中主要采用的是C#語言。這是因為從發(fā)展的趨勢來看,JavaScript的使用率將會逐漸下降。現(xiàn)在開始對這個主要功能進(jìn)行編程。首先在項目(Project)面板的空白區(qū)域單擊鼠標(biāo)右鍵,然后在彈出的上下文菜單中依次選擇“Create|C#Script”,就可以創(chuàng)建一個新的腳本文件。另外,也可以從應(yīng)用程序菜單處依次選擇“Assets|Create|C#Script”來創(chuàng)建一個新的腳本文件,如圖2.11所示。圖2.11創(chuàng)建一個新的C#腳本當(dāng)創(chuàng)建了腳本之后,需要為腳本起一個描述性的名字。本書起的名字為“Coin.cs”。在Unity中,每一個腳本文件都對應(yīng)一個與其同名的類。因此,“Coin.cs”文件對應(yīng)的就是“Coin”類。這個“Coin”類將封裝一個金幣的所有行為,并最終會附加到場景中的金幣上,如圖2.12所示。圖2.12為腳本文件命名在對象檢查(Inspector)面板中雙擊Coin.cs,就可以使用MonoDevelop打開這個文件。MonoDevelop是一款Unity自帶的第三方IDE應(yīng)用,它可以實現(xiàn)對游戲中的代碼進(jìn)行編寫和修改。當(dāng)一個文件在MonoDevelop中打開之后,它的內(nèi)容就會如代碼示例2.1所示的在MonoDevelop中顯示出來。代碼示例2.1:
usingUnityEngine;
usingSystem.Collections;
publicclassCoin:MonoBehaviour
{
//Usethisforinitialization
voidStart(){}
//Updateiscalledonceperframe
voidUpdate(){}
}
代碼示例的下載可以使用自己的賬號從\h.處下載本書的代碼示例。無論你在哪里購買的本書,都可以訪問\h/support并進(jìn)行注冊,書中的資源也可以通過電子郵件的形式發(fā)送給你??梢园凑杖缦虏襟E來下載這些文件:使用電子郵箱地址在頁面上注冊,如果已經(jīng)注冊過了,那么直接登錄即可;找到并使用鼠標(biāo)單擊位于頁面頂端的“SUPPORT”;單擊“CodeDownloads&Errata”;在搜索search框中輸入要下載資源的書的名字;選擇要下載資源的書;在下拉菜單中選中購買本書的地點;單擊“CodeDownload”。將這些文件下載了之后,要確定解壓縮軟件已經(jīng)更新到了最新的版本:WinRAR/7-ZipforWindows;Zipeg/iZip/UnRarXforMac;7-Zip/PeaZipforLinux。默認(rèn)情況下,所有新創(chuàng)建的類都派生自“MonoBehavior”類,這個類中定義了一些對所有組件都通用的函數(shù)?!癈oin”類具有兩個自動生成的函數(shù),也就是Start()和Update()。這些函數(shù)都是由Unity自動調(diào)用的事件。當(dāng)游戲?qū)ο螅P(guān)聯(lián)了這個游戲腳本)在場景中創(chuàng)建時,就會調(diào)用Start()函數(shù)。Update()函數(shù)會在每一幀被附加了游戲腳本的對象中調(diào)用一次。Start()函數(shù)主要用來實現(xiàn)代碼的初始化,Update()函數(shù)主要用來實現(xiàn)那些隨著事件推移的行為,例如運動和變化?,F(xiàn)在,將新創(chuàng)建的腳本文件與場景中的金幣對象進(jìn)行管理,可以從項目(Project)面板處將“Coin.cs”文件拖曳到金幣對象上。當(dāng)完成以后,一個新的金幣組件就被添加到了游戲?qū)ο笊?。這意味著這個腳本已經(jīng)關(guān)聯(lián)到了游戲?qū)ο笊?,如圖2.13所示,一個關(guān)聯(lián)了腳本的游戲?qū)ο?。圖2.13一個關(guān)聯(lián)了腳本的游戲?qū)ο螽?dāng)一個腳本與一個游戲?qū)ο箨P(guān)聯(lián)到一起之后,這個腳本就作為這個游戲?qū)ο蟮囊粋€組件而存在。一個腳本文件可以添加到多個游戲?qū)ο笊希踔量梢员欢啻翁砑拥酵粋€游戲?qū)ο笊?。每個組件都代表著一個單獨而且不同的類的實例化。當(dāng)一個腳本以這種方式添加進(jìn)來之后,Unity會自動地調(diào)用它的函數(shù),例如Start()和Update()??梢栽赟tart()函數(shù)中加入一個Debug.Log語句來確認(rèn)腳本是否能正常工作,這個語句在場景中的游戲?qū)ο蟊粍?chuàng)建時在命令行窗口輸出一個調(diào)試信息。查看如下所示的代碼示例2.2。代碼示例2.2:
usingUnityEngine;
usingSystem.Collections;
publicclassCoin:MonoBehaviour
{
//start()是初始化函數(shù)
voidStart(){
Debug.Log("ObjectCreated");
}
//Update在每一幀調(diào)用一次
voidUpdate(){
}
}
如果按下工具欄上的“Play”鍵,或者按下鍵盤上的“Ctrl+P”組合鍵,來運行這個向游戲?qū)ο笊咸砑恿饲懊娴哪莻€腳本的游戲,就會在控制臺窗口中看到一條內(nèi)容為“ObjectCreated”的信息,每當(dāng)這個類進(jìn)行實例化的時候,都會輸出一次(見圖2.14)。圖2.14在控制臺窗口處輸出消息現(xiàn)在已經(jīng)為Coin類創(chuàng)建了最基本的腳本,并且已經(jīng)將這個腳本成功附加到了金幣對象上。接下來,繼續(xù)編寫一些函數(shù),這些函數(shù)將會記錄采集過的金幣信息。2.3對金幣進(jìn)行計數(shù)如果整個場景里只有一個金幣,那么這個金幣采集游戲就有些名不符實了。本游戲的核心設(shè)計思路就是在一個關(guān)卡中應(yīng)該包含很多個金幣,玩家應(yīng)該在系統(tǒng)計時結(jié)束前收集完這些金幣。現(xiàn)在,如果想要知道玩家是否將所有的金幣都收集齊了,首先得先知道這個場景中總共有多少個金幣。畢竟如果不知道金幣的總量,也就無法知道是否已經(jīng)將所有的金幣收集全了。所以,第一個任務(wù)就是通過Coin類來輕松地知道任意時刻金幣的總數(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毀時調(diào)用OnDestroy函數(shù)
voidOnDestroy()
{
//減少金幣數(shù)量
--Coin.CoinCount;
//檢查剩余金幣數(shù)量
if(Coin.CoinCount<=0)
{
//玩家獲得勝利
}
}
//-------------------------
}
//-------------------------
下面就代碼示例2.3進(jìn)行以下幾點總結(jié)。Coin類中有一個靜態(tài)的成員變量——CoinCount。這個變量是靜態(tài)的,可以被這個類的所有實例所共享。該變量中記錄了場景中金幣的總數(shù),類中的每個實例都可以訪問該變量。每當(dāng)場景中的一個金幣游戲?qū)ο蟊粍?chuàng)建時,就會自動調(diào)用Start()函數(shù)。在場景啟動時調(diào)用Start函數(shù)就可以設(shè)定游戲初始的金幣。每當(dāng)初始化一個實例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年知識產(chǎn)權(quán)許可合同許可使用條件
- 2024年高級信息安全服務(wù)外包合同
- 2025年度數(shù)據(jù)中心布線施工與環(huán)保驗收服務(wù)協(xié)議3篇
- 2025年度數(shù)據(jù)中心廠房股權(quán)轉(zhuǎn)讓及運維服務(wù)合同樣本3篇
- 2024版大壩整改施工項目施工質(zhì)量管理合同3篇
- 2024年貨車共享平臺租賃合同
- 2024年高速路路基建設(shè)土石方工程承包協(xié)議一
- 2024年車展保險服務(wù)合同
- 2024細(xì)胞研究及產(chǎn)業(yè)化應(yīng)用技術(shù)服務(wù)合同版B版
- 2024年限定商品代理經(jīng)銷權(quán)協(xié)議書版
- (一模)株洲市2025屆高三教學(xué)質(zhì)量統(tǒng)一檢測 英語試卷
- 2025年度建筑施工現(xiàn)場安全管理合同2篇
- 社區(qū)意識形態(tài)工作責(zé)任制實施細(xì)則模版(2篇)
- 礦業(yè)公司規(guī)章制度匯編
- 介入導(dǎo)管室護(hù)士長職責(zé)
- 《國家課程建設(shè)》課件
- 四川省南充市2023-2024學(xué)年高一上學(xué)期期末考試 歷史 含解析
- 樣板間合作協(xié)議
- 2024-2025學(xué)年湖北省武漢市華中師大一附中高三上學(xué)期期中英語試題及答案
- 2024解析:第一章機械運動-講核心(解析版)
- 屋面板的拆除與更換施工方案
評論
0/150
提交評論