一個(gè)人做游戲(一)——打氣球手游
UP之前教程發(fā)現(xiàn)坑開的大了點(diǎn),以及對各位幫助也不是太大,所以《從零開始做游戲》這個(gè)系列暫停停更,以及UP重新開個(gè)坑。
本次新專題叫一個(gè)人做游戲,UP準(zhǔn)備繼這個(gè)專題做個(gè)很小的游戲,也就是一個(gè)人絕對可以完成的(至少UP一個(gè)人肯定可以完成)。
在這里會(huì)涉及到游戲的策劃、程序、美術(shù)、音樂所有方面的講解,當(dāng)然UP策劃出生,所以這里講策劃的地方肯定是最多的,想學(xué)游戲制作的小伙伴不要錯(cuò)過。
這個(gè)游戲開發(fā)成本很低,目前已經(jīng)寫好了想法框架,但是UP不會(huì)一次性把想法都放給大家看,在整個(gè)設(shè)計(jì)中,你會(huì)清楚一款游戲的需求是怎么增加起來的。

策劃篇
這款游戲的規(guī)則非常簡單,就是屏幕中會(huì)隨機(jī)飛出氣球,然后你只用一戳就爆炸了。
如果氣球飛出屏幕就游戲結(jié)束,計(jì)算得分。
就是這么簡單,開干。

美術(shù)篇
首先我們來畫個(gè)大概游戲的界面,為了成本更低,我們使用540*960的分辨率來作游戲畫面。
UP用PS+鋼筆工具簡單的繪制了游戲的界面,因?yàn)閁P是個(gè)美術(shù)廢,所以在設(shè)計(jì)的時(shí)候盡量希望以最簡單的方式來設(shè)計(jì)畫面。
然后就去搜索扁平風(fēng)格背景圖,然后找到了類似作文本的圖片,于是UP覺得,這種感覺好像還不錯(cuò),適合我這種美術(shù)廢,于是便這樣簡簡單單的繪制好了。
在繪制素材的時(shí)候可以去參考別人的設(shè)計(jì),比如真實(shí)的氣球,或者氣球的UI圖標(biāo)等,然后模仿別人的樣子自己畫一個(gè),因?yàn)檫@些素材都長的差不多,不會(huì)非常的存在版權(quán)問題,所以一般來說模仿一下沒有問題。

雖然不是很好看,或許字體全部都搞成手繪風(fēng)還會(huì)更舒服一些,不過這個(gè)問題今后再思考吧。
那么接下來UP準(zhǔn)備打開程序,并切圖了。

程序篇
我們首先準(zhǔn)備項(xiàng)目,依然是U3D,依然是2D項(xiàng)目,UP建議沒有一個(gè)多人團(tuán)隊(duì)最好不要玩3D游戲,否則工作量再翻倍。

接下來我們做的是切圖,將之前的圖每一部分都導(dǎo)出PNG,導(dǎo)出辦法很簡單,把所有圖層都關(guān)掉,然后選擇一個(gè)圖層,剪切透明區(qū)域,存儲(chǔ)為PNG格式,如果這個(gè)都不會(huì),請先去找找Photoshop基礎(chǔ)教程。

最后圖片全部切好后是這樣的:

然后我們開始干程序的事,程序的事情挺多的,首先第一步是讓氣球飛起來。
這里不再過多的描述UNITY的基礎(chǔ)操作了,因?yàn)閁P曾經(jīng)有很詳細(xì)的講解過項(xiàng)目是如何安排在文件夾中的以及UNITY創(chuàng)建項(xiàng)目是怎么操作的,如果想知道,可以看看下面這個(gè)文章。

首先UP要教大家一個(gè)非常重要的腳本:
transform.Translate //平移
不過如果要寫個(gè)往上飛的氣球,應(yīng)該這樣寫:
transform.Translate(Vector3.up* Time.deltaTime);
Vector3.forward的意思就是往上,Time.deltaTime又是什么意思呢。
Time.deltaTime簡單的解釋就是無論你設(shè)備配置有多高,都強(qiáng)行按照固定的速度上升,如果不加這一段,很可能你的電腦配置高移動(dòng)速度就會(huì)更快,你的電腦配置卡移動(dòng)速度就會(huì)更慢。
或許初學(xué)者還是沒有明白,沒關(guān)系,你記住上面那個(gè)語句就可以了,了解復(fù)制粘貼可以實(shí)現(xiàn)向上的功能就好。
題外話:U3D官網(wǎng)有每一個(gè)腳本的說明,但是卻只有英文版,不過國內(nèi)有人漢化了,詳見www.ceeger.com/Script/
我們創(chuàng)建了個(gè)叫做ballFly的腳本,然后在里面粘貼了這段代碼

我們把代碼拖入氣球中運(yùn)行程序來運(yùn)行一下

好了,下一步我們要解決點(diǎn)擊氣球后氣球破掉的代碼,我們首先要知道如何判斷鼠標(biāo)左鍵按下的腳本,也很簡單。
if(Input.GetMouseButtonDown(0)) //如果鼠標(biāo)左鍵按下
//執(zhí)行后面的內(nèi)容
接下來你要了解如何判斷點(diǎn)到了氣球,其實(shí)也很簡單,在網(wǎng)上搜索一下Unity 2d 點(diǎn)擊物體,就可以知道寫法了。
其實(shí)這段寫法的意思是,鼠標(biāo)左鍵按下后,向鼠標(biāo)點(diǎn)擊的地方發(fā)射一條射線,如果射線碰撞到了物體(代碼是“不是沒有碰到物體”),則打印出物體的當(dāng)前坐標(biāo)和名字。

可能初學(xué)者依然很懵,碰撞是什么,其實(shí)在游戲設(shè)計(jì)中,最重要的就是碰撞,簡單來說就是兩個(gè)物體的區(qū)域重合了,實(shí)際上在游戲中每個(gè)物體都有個(gè)你看不見的框,只有程序才看得見,比如打飛機(jī)游戲中,物體子彈和物體機(jī)體重合了,就觸發(fā)了一個(gè)碰撞。
而往往彈幕設(shè)計(jì)游戲中,都會(huì)把機(jī)體的碰撞框設(shè)置的比實(shí)際圖片小,所以才有擦彈玩法
所以這里我們也需要為氣球添加一個(gè)碰撞盒,同時(shí)你還可以更清晰的了解到什么叫做“你看不見的框”。

我們在設(shè)計(jì)碰撞框的時(shí)候,比實(shí)際氣球還要更大一些,這是為了增加手感,降低游戲難度而做。
我們運(yùn)行程序點(diǎn)擊氣球,出現(xiàn)了下圖的顯示,意思就是程序功能成功了。

接下來我們要讓氣球被點(diǎn)后boom。
首先我們把代碼改成了這樣,意思就是如果點(diǎn)擊后判斷名字是redBall,就打印boom

當(dāng)然,這只是其中一個(gè)步驟,寫代碼的時(shí)候步子要小,最好每一個(gè)功能都測試通過再寫下一個(gè)功能,不然的話最后發(fā)現(xiàn)出問題了都不知道哪里出的。
測試通過后,我們加了一句代碼
Destroy(hit.collider.gameObject); //銷毀這個(gè)物體。
好了至此我們基礎(chǔ)功能就寫完了。

但是這個(gè)游戲就這樣會(huì)不會(huì)太無聊了點(diǎn)呢,而且根本就沒有可玩性好嗎,所以我們應(yīng)該為氣球加入隨機(jī)生成的功能。
在學(xué)習(xí)生成前,我們需要知道一個(gè)概念Prefab模塊化,簡單的說就是把這個(gè)物體做成模板,讓其可以批量化,而且修改的時(shí)候也可以只用修改prefab物體就可以批量把所有的組件修改掉。

接下來我們需要掌握一個(gè)代碼,生成物體。
實(shí)例代碼是這樣:Instantiate (prefab, Vector3(2.0, 0, 0), Quaternion.identity);
然后我們最后修改成了這樣:

上面的代碼中,Random.Range是隨機(jī)數(shù),還有整個(gè)if功能是說在固定多少秒內(nèi)執(zhí)行一次這樣的事情,這些知識在拋硬幣教程里都教學(xué)過,有興趣可以去看看上一期。
我們運(yùn)行一下,現(xiàn)在情況是這樣的

是不是覺得太死板了,有2個(gè)問題:
氣球出現(xiàn)頻率太固定
氣球速度太固定
所以我們現(xiàn)在需要修改下這幾個(gè)問題,具體代碼UP會(huì)放入git里,之后去git看看吧。
最后我們做出了這樣的小游戲,UP試玩了下


后記
用了一期時(shí)間來寫這個(gè)教程,當(dāng)然還是沒有寫完。
現(xiàn)在還沒有寫計(jì)分與死掉的效果
氣球戳爆后的特效也沒有加入
這幾個(gè)需求就留在下一期完成吧
項(xiàng)目代碼git:github.com/suxsho/terobiBalloon