李愛(ài)軍
(蘇州職業(yè)大學(xué)計(jì)算機(jī)工程學(xué)院,蘇州 215104)
主要游戲方式便是酷跑。以一個(gè)成功的酷跑游戲《神廟逃亡》為例,我們可知酷跑類游戲的主要功能。玩家不能控制角色的移動(dòng)速度,隨著游戲時(shí)間的推移,角色移動(dòng)的速度越來(lái)越快,玩家操作的時(shí)間越來(lái)越短,考驗(yàn)玩家的反應(yīng)能力來(lái)達(dá)到增加游戲難度的目的。
游戲有很多種類,主要有策略游戲、動(dòng)作游戲、競(jìng)速游戲、卡牌游戲、冒險(xiǎn)游戲、體育游戲、休閑游戲、音樂(lè)游戲、模擬游戲、射擊游戲等。
本游戲?yàn)榭崤苡螒?,?yīng)歸為競(jìng)速游戲或休閑游戲。
本游戲的運(yùn)行環(huán)境為手機(jī)Android 6.0 及以上系統(tǒng)版本,它的優(yōu)點(diǎn)是游戲界面非常簡(jiǎn)潔,且占用的內(nèi)存資源少,操作起來(lái)很方便。
本游戲主要靠滑動(dòng)屏幕控制角色移動(dòng)來(lái)操作游戲,控制角色躲避障礙拾取金幣。游戲地圖分為三個(gè)跑道,向左滑為向左跑道移動(dòng),向右滑為向右跑道移動(dòng),向上滑為跳躍,向下滑為滾動(dòng),當(dāng)角色在空中時(shí)向下滑動(dòng)可以使角色快速落地滾動(dòng)。
玩家運(yùn)行主程序進(jìn)入游戲畫(huà)面,出現(xiàn)開(kāi)始菜單。開(kāi)始菜單包含兩個(gè)按鈕,開(kāi)始和退出。點(diǎn)擊開(kāi)始按鈕,游戲開(kāi)始運(yùn)行,點(diǎn)擊退出按鈕,退出主程序。開(kāi)始游戲后彈出暫停按鈕,點(diǎn)擊暫停按鈕游戲暫停,出現(xiàn)暫停菜單。暫停菜單包含兩個(gè)按鈕,返回游戲和退出游戲。點(diǎn)擊返回游戲,游戲繼續(xù);點(diǎn)擊退出按鈕,游戲退出。當(dāng)游戲角色死亡時(shí),出現(xiàn)結(jié)束菜單。結(jié)束菜單包含兩個(gè)按鈕,再次開(kāi)始游戲和退出游戲。點(diǎn)擊再次開(kāi)始游戲,游戲重新開(kāi)始;點(diǎn)擊退出游戲,退出主程序。
本游戲是采用3D 虛擬技術(shù)和游戲物理引擎進(jìn)行開(kāi)發(fā)的,游戲的現(xiàn)場(chǎng)布景具有很強(qiáng)的真實(shí)感、立體感以及逼真的光影效果,用戶能夠在游戲中感受到絢麗多彩且富有沖擊感的感官體驗(yàn)。
2.1.1 酷跑角色與場(chǎng)景搭建
在Scene 界面通過(guò)導(dǎo)入模型,拖拽搭建等步驟完成場(chǎng)景的初步搭建。
2.1.2 金幣組
將8個(gè)金幣設(shè)為一組,布置在跑道上。
2.1.3 障礙物與碰撞監(jiān)測(cè)器
障礙物有木板、小汽車、大巴,分別添加碰撞檢測(cè)器。
2.1.4 道具
將道具模型導(dǎo)入,制作碰撞動(dòng)畫(huà)粒子特效。
2.1.5 游戲文本菜單
游戲菜單用來(lái)開(kāi)始或退出游戲以控制游戲進(jìn)程,右側(cè)為道具buff 剩余時(shí)間,右下角為音樂(lè)控制按鈕,左上角為收集的金幣數(shù)。
2.2.1 道路設(shè)置
游戲只有一個(gè)游戲場(chǎng)景,為一條無(wú)限長(zhǎng)的馬路。通過(guò)交替移動(dòng)兩段足夠長(zhǎng)的道路實(shí)現(xiàn)“無(wú)限”道路的功能。
void Update(){
if(transform.position.z>floorOnRunning.transform.position.z+32)
{ RemoveItem(floorOnRunning);
Addtem(floor0nRunning);
floorOnRunning. transform. position=new Vector3(0,0,floorforsard.transform.position.z+32);
Game0bject temp=floorOnRunning;
floorOnRunning=floorForward;
floorForward=temp;}}
2.2.2 角色奔跑
作為一個(gè)酷跑類游戲,首先要讓游戲主角跑起來(lái),我們通過(guò)在主角的模型上掛載一個(gè)主角控制腳本來(lái)實(shí)現(xiàn)。主角的控制腳本名為PlayerController。
通過(guò)在z軸正方向給主角添加一個(gè)正值,使主角可以沿z 軸正方向勻速跑動(dòng)。然后在y 軸負(fù)方向,也就是默認(rèn)的地面方向添加正值,使主角可以穩(wěn)定在地面上,不會(huì)違背物理常識(shí)。這里沒(méi)有選用unity3d 自帶的物理系統(tǒng),因?yàn)槠湎到y(tǒng)在應(yīng)用時(shí)發(fā)生明顯的錯(cuò)誤效果,所以進(jìn)行了變量的賦值使其實(shí)現(xiàn)較真實(shí)的物理效果。
游戲主角以默認(rèn)速度奔跑:
moveDirection.z=speed;
moveDirection.y-=gravity*Time.deltaTime;
characterController.Move((xDirection*10+moveDirection)*Time.deltaTime);
酷跑類游戲在游戲過(guò)程中會(huì)通過(guò)緩慢增加主角的奔跑速度來(lái)減少躲避障礙物的反應(yīng)時(shí)間,從而起到加大游戲難度的效果。本游戲中主角每奔跑一段固定長(zhǎng)度的路程時(shí)增加一點(diǎn)奔跑速度,同時(shí)為了防止某些實(shí)力過(guò)于強(qiáng)的玩家在游戲中長(zhǎng)時(shí)間不失敗導(dǎo)致的主角奔跑速度過(guò)高,游戲中還為主角的奔跑速度設(shè)置了最大值,使其速度不能無(wú)限制增長(zhǎng)。
限制游戲主角的最大奔跑速度:
private void SetSpeed(float newSpeed)
{ if(newSpeed <=maxSpeed)
speed=newSpeed;
else
speed=maxSpeed; }
2.2.3 滑動(dòng)檢測(cè)
本游戲的操作非常簡(jiǎn)單,用指針在屏幕上進(jìn)行上下左右的滑動(dòng)即可控住主角的移動(dòng),一共設(shè)置了4個(gè)操作檢測(cè),分別為“向上”“向下”“向左”“向右”。
首先創(chuàng)建一個(gè)枚舉類來(lái)存放上下左右空5種滑動(dòng)狀態(tài)。
滑動(dòng)方向枚舉類:
public enum InputDirection
{ NULL,
Left,
Right,
Up,
Down }
當(dāng)玩家沒(méi)有觸摸屏幕時(shí),屏幕沒(méi)有檢測(cè)到指針,滑動(dòng)狀態(tài)默認(rèn)為空值,即游戲主角以默認(rèn)速度勻速奔跑。當(dāng)玩家向上滑動(dòng)屏幕時(shí),屏幕檢測(cè)到指針,將狀態(tài)更新為“開(kāi)始滑動(dòng)”并記錄當(dāng)前的指針位置。
當(dāng)指針以某一個(gè)反向持續(xù)滑動(dòng)20個(gè)單位時(shí),記錄此位置與開(kāi)始滑動(dòng)位置時(shí)的向量,并將其轉(zhuǎn)化為角度,根據(jù)角度分析此次滑動(dòng)的方向,同時(shí)將滑動(dòng)狀態(tài)更新為“未開(kāi)始滑動(dòng)”。
2.2.4 玩家移動(dòng)
當(dāng)游戲中檢測(cè)到玩家的控制輸入后,角色要根據(jù)控制指令進(jìn)行相應(yīng)的移動(dòng)。當(dāng)玩家向左滑動(dòng)時(shí),如果角色不在最左邊的道路上,那么角色向左移動(dòng)一格。當(dāng)玩家向右滑動(dòng)時(shí),如果角色不在最右邊的道路上,那么角色向右移動(dòng)一格。
當(dāng)玩家向上滑動(dòng)時(shí),角色進(jìn)行一次跳躍。通過(guò)給角色y軸正方向添加正值來(lái)改變角色的豎直方向的位置。
當(dāng)玩家向下滑動(dòng)時(shí),如果角色此時(shí)在地面上,那么角色進(jìn)行一次翻滾,如果角色測(cè)試在跳躍中,那么角色迅速落到地面。與跳躍類似,通過(guò)給角色y軸負(fù)方向添加正值來(lái)改變角色在豎直方向的位置。
翻滾動(dòng)作代碼:
if(inputDirection==InputDirection.Down)
{ AnimationManager.instance.animationHandler=AnimationManager.instance.PlayRoll; }
當(dāng)主角已經(jīng)到達(dá)最左或最右的位置時(shí)不能再往左或往右移動(dòng),需要限制主角的移動(dòng)以免跑出地圖。
2.2.5 道具效果
本游戲一共設(shè)置了4種道具,分別為磁鐵道具、加速道具、雙倍積分道具和二連跳道具。
磁鐵道具的效果為:角色自動(dòng)吸取道路上的金幣,持續(xù)一段時(shí)間。實(shí)現(xiàn)原理為,為角色添加一個(gè)大小等于磁鐵作用范圍的碰撞檢測(cè)器,當(dāng)碰撞檢測(cè)器碰撞到金幣時(shí),觸發(fā)金幣的事件。拾取到磁鐵道具時(shí)激活該碰撞檢測(cè)器,持續(xù)時(shí)間結(jié)束時(shí)自動(dòng)關(guān)閉。
二連跳道具效果為,玩家可以在跳躍過(guò)程中再次跳躍,當(dāng)角色拾取到二連跳道具時(shí),可以在道具持續(xù)時(shí)間內(nèi)進(jìn)行二次跳躍。
二連跳道具代碼:
void JumpDouble()
{ AnimationManager.instance.animationHandler=AnimationManager.instance.PlayDoubleJump;
moveDirection.y+=jumpValue*1.3f; }
雙倍積分道具的效果為:將拾取金幣時(shí)獲得的積分翻倍,持續(xù)一段時(shí)間。實(shí)現(xiàn)原理為:增加積分的數(shù)值。
加速道具的效果為:大幅度提升角色的速度,持續(xù)一段時(shí)間。實(shí)現(xiàn)原理:增加奔跑速度的數(shù)值。
2.2.6 相機(jī)跟隨
本游戲?yàn)榈谌朔Q視角游戲,為了使角色始終處于畫(huà)面中央,需要將顯示游戲畫(huà)面的相機(jī)對(duì)象設(shè)置為始終跟隨角色移動(dòng),位置處于角色身后的斜上方。
相機(jī)跟隨效果代碼:
void LateUpdate()
{ if(!isShaking
&&GameController.instance.isPlay
&&!GameController.instance.isPause)
{ pos.x=target.transform.position.x;
pos.y=Mathf.Lerp(pos.y,target.transform.position.y+height,Time.deltaTime*5);
pos.z=target.transform.position.z-distance;
transform.position=pos; }
2.2.7 碰撞檢測(cè)
碰撞檢測(cè)是非常重要的功能,游戲內(nèi)幾乎所有的物體交互都要依靠碰撞檢測(cè)來(lái)觸發(fā)。在游戲制作中,給需要碰撞檢測(cè)功能的物體添加碰撞檢測(cè)器組件boxcolliger便可實(shí)現(xiàn)碰撞檢測(cè)。
當(dāng)角色觸碰到4 個(gè)具有特殊效果的道具時(shí),激活特殊效果,銷毀道具,開(kāi)啟效果持續(xù)時(shí)間計(jì)時(shí)器。
當(dāng)角色觸碰到金幣時(shí),銷毀金幣,增加玩家的積分。如果角色此時(shí)擁有磁鐵道具,那么當(dāng)代表磁鐵效果返回的碰撞檢測(cè)器觸碰到金幣時(shí),先使金幣平滑地飛向角色,制作磁鐵吸引的效果,當(dāng)金幣觸碰到角色時(shí),金幣銷毀,增加玩家的積分。
當(dāng)角色觸碰到障礙物時(shí),角色死亡,執(zhí)行死亡動(dòng)畫(huà)。
障礙物碰撞。障礙物用來(lái)阻擋游戲角色的前進(jìn),并且在游戲角色碰撞到障礙物時(shí)結(jié)束游戲。對(duì)于大部分障礙物,都可以直接添加碰撞器使其在碰撞時(shí)觸發(fā)死亡效果。有兩種障礙物是特例,一種是車輛,游戲中的兩種車輛在玩家碰撞到時(shí)會(huì)觸發(fā)死亡效果,但是當(dāng)游戲角色跳躍到車的頂部時(shí),是可以在上面行走的,所以在添加碰撞器時(shí)要注意這一點(diǎn);而另一種是下方有空間的擋板,游戲角色在沒(méi)有二連跳時(shí)無(wú)法越過(guò),只能通過(guò)從下方空間翻滾經(jīng)過(guò),在游戲制作中,翻滾動(dòng)作雖然會(huì)播放翻滾動(dòng)畫(huà),但是碰撞器并不會(huì)播放翻滾動(dòng)畫(huà),所以要在播放翻滾動(dòng)畫(huà)時(shí)短暫地關(guān)閉碰撞器,防止碰撞到障礙物,在經(jīng)過(guò)障礙物后再次將碰撞器開(kāi)啟。
2.2.8 路面隨機(jī)生成障礙物
酷跑類游戲通常沒(méi)有通關(guān)功能,所以只要玩家可以保持游戲不失敗,就可以無(wú)限進(jìn)行游戲。而前面講到本游戲?qū)崿F(xiàn)無(wú)限道路的方法為交替移動(dòng)兩塊足夠長(zhǎng)的道路,玩家需要在道路上使用道具或躲避障礙物。為了增加游戲的趣味性,游戲制作中需要在道路上隨機(jī)生成各種障礙物或道具。但是在制作過(guò)程中發(fā)現(xiàn),如果道具的生成完全隨機(jī)化,那么會(huì)出現(xiàn)大量的物品重疊或沒(méi)有通路等問(wèn)題。所以為了保證在相對(duì)隨機(jī)的環(huán)境下也能正常游戲,解決辦法為手動(dòng)制作多組道路上的障礙物排列,每當(dāng)角色移動(dòng)到新的道路時(shí),隨機(jī)選取一組預(yù)先制作好的障礙物排列。
2.2.9 界面顯示
除了游戲主要的環(huán)境和角色以外,還需要多個(gè)UI 界面來(lái)顯示一些游戲內(nèi)數(shù)值。本游戲設(shè)置了積分顯示,道具持續(xù)時(shí)間顯示。積分顯示為記錄玩家拾取金幣的數(shù)值,普通情況下玩家每拾取1 個(gè)金幣,積分+1,在雙倍積分道具效果持續(xù)時(shí)間內(nèi),玩家每拾取一個(gè)金幣,積分+2。道具持續(xù)時(shí)間顯示為記錄玩家當(dāng)前已激活道具的效果剩余時(shí)間,當(dāng)玩家觸碰到道具時(shí)開(kāi)始計(jì)時(shí),當(dāng)計(jì)時(shí)時(shí)間結(jié)束時(shí)道具效果結(jié)束。
金幣積分計(jì)數(shù)代碼:
public override void HitItem()
{ base.HitItem();
GameAttribute.instance.AddCoin(1); }
2.2.10 游戲進(jìn)程控制
所有單機(jī)都必不可少地設(shè)置開(kāi)始暫停等游戲進(jìn)程控制。本游戲一共設(shè)置了開(kāi)始游戲、暫停游戲、恢復(fù)游戲、重新開(kāi)始游戲和退出游戲五個(gè)選項(xiàng)。第一次打開(kāi)游戲時(shí)彈出開(kāi)始游戲和退出游戲。點(diǎn)擊開(kāi)始游戲按鈕,游戲開(kāi)始并彈出暫停按鈕;點(diǎn)擊退出游戲按鈕,游戲關(guān)閉;點(diǎn)擊暫停按鈕,游戲暫停并彈出恢復(fù)游戲按鈕和退出按鈕;點(diǎn)擊恢復(fù)游戲按鈕,游戲繼續(xù);點(diǎn)擊退出游戲按鈕,游戲關(guān)閉。當(dāng)角色死亡時(shí),彈出重新開(kāi)始游戲按鈕和退出游戲按鈕。點(diǎn)擊重新開(kāi)始按鈕,游戲重新開(kāi)始,開(kāi)始界面與第一次進(jìn)入時(shí)一致;點(diǎn)擊退出游戲按鈕,游戲退出。通過(guò)封裝方法到按鍵,由點(diǎn)擊事件激活。
當(dāng)游戲重新開(kāi)始時(shí),需要將一切數(shù)值清空,包括玩家已獲得的積分,當(dāng)前已激活道具的剩余時(shí)間等,還要重置角色的位置和道路的位置。
2.2.11 動(dòng)畫(huà)與聲音播放
游戲過(guò)程中角色需要切換不同的動(dòng)畫(huà),正常跑步時(shí)播放跑步動(dòng)畫(huà),向左或向右移動(dòng)時(shí)播放移動(dòng)動(dòng)畫(huà),跳躍時(shí)播放跳躍動(dòng)畫(huà),翻滾時(shí)播放翻滾動(dòng)畫(huà),碰撞障礙物時(shí)播放倒地動(dòng)畫(huà)。
本游戲一共有五種不同的音效,分別為菜單鍵點(diǎn)擊音效,金幣拾取音效,觸發(fā)道具音效,碰撞障礙物音效和滑動(dòng)操作音效。
在游戲制作完成后,需要進(jìn)行游戲測(cè)試,用來(lái)測(cè)試游戲中是否有與預(yù)期不符的異常。因?yàn)閁nity3D 引擎可以實(shí)時(shí)測(cè)試的優(yōu)點(diǎn),我們可以在游戲發(fā)布前先進(jìn)行初步的流程測(cè)試。
首先測(cè)試游戲主角是否能根據(jù)玩家的操作進(jìn)行正確的動(dòng)作,然后是游戲中的4個(gè)道具是否可以正確地激發(fā)效果。同時(shí),道具在激活時(shí),游戲界面右上角的道具效果計(jì)時(shí)界面也要正確地為道具效果計(jì)時(shí),在倒計(jì)時(shí)結(jié)束時(shí)道具效果也要同時(shí)消失。然后是游戲主角在拾取金幣時(shí)是否能正確地記錄金幣數(shù),在雙倍積分效果的持續(xù)時(shí)間內(nèi)拾取金幣是否可以正確地增加雙倍金幣數(shù)。還有游戲場(chǎng)景內(nèi)的各個(gè)障礙物測(cè)試,不同的障礙物擁有不用的碰撞區(qū)域,游戲角色在碰撞到障礙物時(shí)能否順利觸發(fā)死亡效果。最后是游戲菜單,對(duì)所有的游戲菜單按鍵測(cè)試,例如開(kāi)始、暫停、退出等按鍵能否正確地實(shí)現(xiàn)。
游戲無(wú)論是在汽車的選擇、關(guān)卡的選擇還是在音效這一感官體驗(yàn)上,都能給玩家?guī)?lái)不一樣的視覺(jué)感受與聽(tīng)覺(jué)感受。主菜單界面的幫助界面能夠幫助新手玩家更好地了解本游戲的玩法,選擇不同的車輛進(jìn)行游戲會(huì)給玩家?guī)?lái)煥然一新的感覺(jué),不同的關(guān)卡具有不同的難易程度,能夠適合不同的玩家群體,震撼的游戲背景音樂(lè)能夠帶來(lái)刺激的聽(tīng)覺(jué)享受。