王濤 王曉博
【摘 要】本文闡述了一個基于Unity3D開發(fā)的射擊類游戲,重點(diǎn)實(shí)現(xiàn)了碰撞檢測、敵人智能跟蹤、動畫設(shè)置、聲音播放等功能,UI搭建方面實(shí)現(xiàn)了界面的制作、玩家血量條、玩家分?jǐn)?shù)記錄和音量界面的制作。
【關(guān)鍵詞】Unity3D軟件;射擊類游戲;UI界面
1.引言
小游戲作為電子游戲家族中的一個獨(dú)特成員,在其中扮演著重要的角色。通常以休閑益智類為主,主要分為單機(jī)版和網(wǎng)絡(luò)版。本次開發(fā)的噩夢射手就是屬于休閑小游戲,正是迎合了當(dāng)前游戲產(chǎn)業(yè),具備良好的發(fā)展前景。
2.游戲系統(tǒng)設(shè)計(jì)
2.1 場景搭建
游戲素材來自于Unity引擎中自帶的資源商店,在搜索界面輸入Survival shooter就可以搜索到本題的素材,通過下載導(dǎo)入就可將游戲素材導(dǎo)入到Unity資源文件中。根據(jù)原場景進(jìn)行場景搭建,搭建場景的所有游戲?qū)ο蠖紩贖ierarchy視圖中顯示出來,方便開發(fā)者對場景隨時進(jìn)行更改與調(diào)整。
2.2 場景中的物理檢測設(shè)置
游戲中能夠發(fā)生碰撞的物理引擎是Collider組件,受到重力、摩擦力和角摩擦力的是Rigidbody組件,當(dāng)給游戲中的對象加上這些組件的時候,他們就會模擬出現(xiàn)實(shí)世界中的一些物理現(xiàn)象。
在物理引擎中,兩個物體發(fā)生碰撞的條件是:兩個物體都具有碰撞器,并且一個物體必須帶剛體,而且兩個物體發(fā)生相對運(yùn)動,這是在Unity的物理引擎中產(chǎn)生物理碰撞的必要條件。
2.3 UI界面的制作
在本題中游戲界面中顯示的有玩家的血量和得到的分?jǐn)?shù)記錄,當(dāng)按下ESC鍵會彈出聲音控制面板和結(jié)束暫停重新開始界面。
3.游戲功能實(shí)現(xiàn)
3.1 主角的移動
通過獲取虛擬軸來實(shí)現(xiàn)主角的移動,水平虛擬軸和垂直虛擬軸,水平虛擬軸對應(yīng)了鍵盤上的A、D,垂直虛擬軸對應(yīng)了鍵盤的W、S。獲取到他們,將它們賦值給主角的位置,這樣就可以在按下W、A、S、D讓主角移動了,其本質(zhì)就是改變了主角在三維世界中的位置來達(dá)到移動的目的。
3.2 主角的轉(zhuǎn)向
主角的轉(zhuǎn)向是通過鼠標(biāo)來控制的,由于鼠標(biāo)是在屏幕上的,因此首先要將鼠標(biāo)的位置轉(zhuǎn)換到世界坐標(biāo)中,在本題中通過射線檢測的方法與四元數(shù)的轉(zhuǎn)向的方法來讓主角轉(zhuǎn)向并且很自然的轉(zhuǎn)向。
3.3 主角的動畫播放
通過直接拖拽的方式將主角的動畫添加到這個面板中,在游戲剛開始時,不移動主角時,我們就會讓主角執(zhí)行一個閑置的狀態(tài),當(dāng)按下W、A、S、D中的任何一個時,主角就會播放移動的動畫,此時在主角的這個游戲?qū)ο蟮膶傩悦姘迳霞由弦粋€Animator組件,然后將我們創(chuàng)建的這個動畫狀態(tài)機(jī)添加給Animator組件,這樣就這兩個組件連接在一起了,最后在主角的這個腳本中將這個組件拿到,加上一些判定,在適當(dāng)?shù)臅r候來播放這個動畫就可以了。
3.4 主角的射擊
主角的射擊是通過鼠標(biāo)來控制的,當(dāng)玩家按下鼠標(biāo)左鍵的時候,主角會對敵人進(jìn)行射擊,在本題中,主角射出是一條線段,這個線段有一個最遠(yuǎn)距離,也會給場景中的所有對象添加一個層(ShootableMask),也會將敵人添加這個層中,當(dāng)主角打到這個層中的任何一個對象是,這個線段就會以這個對象作為終點(diǎn),否則射線就會打到最遠(yuǎn)的距離。
4.敵人的產(chǎn)生、移動和動畫播放
4.1 敵人的產(chǎn)生
先在已經(jīng)搭建好的場景中創(chuàng)建三個空的游戲?qū)ο?,將它們放置在想要敵人生成的地方,然后再?chuàng)建一個空的游戲?qū)ο髞砉芾磉@三個位置,將在這個空的游戲?qū)ο髵煸谝粋€實(shí)例化敵人的腳本,其次要將素材中的敵人設(shè)置好做成預(yù)設(shè)體,在腳本中拿到預(yù)設(shè)體和將要產(chǎn)生敵人的位置,這樣敵人的生成就可以了。
4.2 敵人的移動是通過自動尋路來尋找主角的。
使用Unity中自帶的導(dǎo)航系統(tǒng),可以讓敵人自動尋路,只要在一開始的時候給敵人一個主角位置,之后就會跟著主角的移動來移動。
4.3 敵人的動畫播放
敵人的動畫的邏輯是,當(dāng)游戲開始時,給敵人加上移動的動畫,動畫參數(shù)選擇Trigger類型的參數(shù),這是從移動的動畫到閑置狀態(tài)的動畫之間的切換,它的觸發(fā)條件就是當(dāng)玩家死亡的時候,而敵人死亡的動畫是無論是在移動狀態(tài)下還是閑置狀態(tài)都會觸發(fā),所以要將死亡的動畫加在任何狀態(tài)的狀態(tài)上,這樣就可以隨時觸發(fā)這個動畫了。
4.4 主角與敵人攻擊邏輯的實(shí)現(xiàn)
主角攻擊與主角的健康,在前面提到過主角的射擊,而主角攻擊就是用槍來射擊敵人,并且給槍設(shè)置的每發(fā)子彈是20點(diǎn)傷害,玩家的血量設(shè)置的是100點(diǎn)血量,在實(shí)現(xiàn)開始前記錄一個當(dāng)前玩家的血量和初始血量。
敵人的攻擊與健康,每一個敵人的游戲?qū)ο笊砩隙紩哂幸粋€觸發(fā)器,當(dāng)敵人接近主角的一定范圍時,敵人就會對玩家發(fā)起攻擊,本題中,敵人的攻擊是10點(diǎn)傷害,血量也是100點(diǎn)上限,在開始前也記錄一個當(dāng)前敵人的血量和初始血量。
4.5 UI界面的搭建與代碼之間的關(guān)聯(lián)
UI界面的搭建也是游戲制作的重要部分,首先我們先創(chuàng)建一個Panel,并且將它的大小設(shè)置與畫布大小一樣,它有一個Image組件,里面有一個Color的屬性,將顏色改變?yōu)榧t色,然后將它的透明度設(shè)置為0,這樣我們在游戲開始時就會看不到。顏色的改變我們就通過主角的健康腳本用代碼來實(shí)現(xiàn),首先我們先獲取到這個能改變這個Panel顏色的組件Image組件,并且要給這個組件賦一個初始值,就是主角受到攻擊以后,顏色顯示為這個初始值,如果沒有受到攻擊,我們就讓顏色通過一個Color.Lerp()的方法漸變?yōu)橥该鳎渲?,這個方法有三個參數(shù),第一個參數(shù)就是主角受到攻擊時的顏色,第二個參數(shù)就是Color.clear,第三個參數(shù)我們會給一個這個顏色從主角受到攻擊時的顏色到透明的一個漸變的速度,因此我們會在剛開始的時候給一個漸變速度,讓這個速度在乘以一個Time.deltaTime,這樣就是顯得很平滑,不至于突兀。
接下來是主角的血條制作,我們使用的一個是叫Slider的游戲組件,他是一個滑動條,這個組件上有Interactable、Min Value、Max Value、Value屬性,其中第一個屬性是是否可交互,默認(rèn)為True,如果將其改為False將不能與代碼鼠標(biāo)完成交互,第二個是這個滑塊的最小值,第三個是這個滑塊的最大值,第四個是這個滑塊的值,默認(rèn)是0到1,在本題中,我們將主角的值設(shè)置為了100,因此我們將這個滑塊的最大值改為100,用來現(xiàn)實(shí)主角的血量。
在主角健康的腳本中將主角當(dāng)前的血量賦值給這個Slider組件,這樣在游戲開始時主角受到攻擊時,那個血量就會根據(jù)敵人的攻擊來減少。
主角所得分?jǐn)?shù)的計(jì)算,寫一個腳本掛載到顯示分?jǐn)?shù)的文本上,通過這個腳本來獲取每個敵人死亡后的分?jǐn)?shù)。
最后就是我們的音量面板和游戲暫停面板,跟上面的做法一樣,在畫布上選擇一些Slider游戲,不過在這又用了兩個新的游戲?qū)ο?,一個Button游戲?qū)ο螅粋€Toggle游戲?qū)ο螅珺utton游戲?qū)ο笫强牲c(diǎn)擊的按鈕,在這通過ESC鍵可以呼出這個面板,最下方有一個繼續(xù)游戲(Resume)按鈕,一個離開游戲按鈕(Quit Game),在上面就是一個是否開關(guān)聲音的Toggle游戲組件,當(dāng)取消這個按鈕時,我們的游戲界面將沒有聲音,在上面就是通過我們的Slider游戲?qū)ο髞韺?shí)現(xiàn)的。通過與代碼的交互,我們就可以實(shí)現(xiàn)以上所說的這些。
5.總結(jié)
本次設(shè)計(jì)的第一人稱射擊的休閑類小游戲,功能單一,后期會逐步完善。
【參考文獻(xiàn)】
[1]吳志達(dá).基于Unity3D游戲引擎的游戲研究與實(shí)現(xiàn)[D].中山大學(xué),2012.
[2]李錦榮,郭磊,譚忠揚(yáng).基于Unity3D平臺的射擊游戲的開發(fā)[J].福建電腦,2015(02)171-173.