一個(gè)人做游戲——打氣球手游(二)
先來(lái)看看上一期的坑
現(xiàn)在還沒(méi)有寫(xiě)計(jì)分的效果
氣球戳爆后的特效也沒(méi)有加入
好了,本次UP會(huì)填這些坑

計(jì)分與失敗的判定
我們來(lái)回顧一下,上一期的時(shí)候 點(diǎn)擊氣球后會(huì)在控制臺(tái)出現(xiàn)提示,注意下圖中的左下角提示。

那么如果要計(jì)分的話,也就是在控制臺(tái)顯示這段代碼里修改了。
不過(guò)在寫(xiě)這個(gè)功能之前有個(gè)經(jīng)驗(yàn)之談,那就是我們要盡多的把數(shù)據(jù)存儲(chǔ)在一個(gè)腳本代碼里,這是為了以后的方便,所以我們首先創(chuàng)建個(gè)叫g(shù)ameConfig的腳本,下圖有個(gè)小細(xì)節(jié),UP為什么一開(kāi)始沒(méi)有成功輸入上game,是因?yàn)檩斎肽J绞侵形?,記得一定要在輸入模式中途改成英文?/p>
然后我在gameconfig中加入了這個(gè)代碼
public static int scores; //分?jǐn)?shù)
這里就涉及到新姿勢(shì)了,首先提一下int scores的的意思是定義一個(gè)叫做scores整數(shù)變量,這個(gè)曾經(jīng)UP有講解過(guò),所以就不在多提。
今天我們?cè)?span id="2s04ssssssss" class="color-purple-01">int scores前面加了個(gè)public static又是什么意思呢。
按照字面來(lái)理解就是共享與靜態(tài),不過(guò)這樣說(shuō)我相信肯定不會(huì)懂,如果以太專業(yè)的術(shù)語(yǔ)解釋也不是UP的風(fēng)格,所以我們還是用人類可理解的語(yǔ)言來(lái)說(shuō)明。
public用在變量前,意味著這個(gè)變量可跨腳本使用,如果不加這個(gè)在別的腳本里就無(wú)法調(diào)用,至于怎么調(diào)用,下面馬上就來(lái)。
static 的意思是在程序運(yùn)行期間,記錄的內(nèi)容無(wú)論你怎么切換場(chǎng)景都是不變的,如果不加static,你切換一個(gè)場(chǎng)景記錄就不見(jiàn)了。(有點(diǎn)像內(nèi)存的那種感覺(jué),只要不關(guān)機(jī)就會(huì)一直緩存這段內(nèi)容,如果關(guān)機(jī)了當(dāng)然就沒(méi)有了)
當(dāng)然,public static的內(nèi)容確實(shí)是常駐在內(nèi)存里的,所以不要寫(xiě)太多了就好,當(dāng)然,這個(gè)數(shù)據(jù)在內(nèi)存里占據(jù)1K都不到的空間吧,現(xiàn)在內(nèi)存動(dòng)不動(dòng)幾十個(gè)G的也不必太擔(dān)心這個(gè)啦。


回到了hitBall腳本中,UP加入了一句這個(gè),不過(guò)你會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了,其實(shí)解決辦法也很容易,創(chuàng)建一個(gè)名叫Plugins的文件夾(注意英文大小寫(xiě)),把gameConfig拖進(jìn)去。

Plugins是什么意思呢,是Unity里的特殊文件夾,主要是用來(lái)放一些特殊插件的,尤其是需要調(diào)用功能的插件。
gameConfig.scores += 1; 意思是讓gameConfig腳本里的scores變量增加1;
X += Y 實(shí)際上就是省略寫(xiě)法的 X = X+Y ,也就是把X的值改變成X+Y,再次申明=不是等號(hào)是賦值,如果不了解程序里=這個(gè)意思 可以看看UP之前的文章,或者去搜索下程序基礎(chǔ)知識(shí),順帶的你還需要了解 ++ 兩個(gè)加號(hào)是什么意思,自己學(xué)習(xí)吧。
接下來(lái)UP把代碼改成了這樣,//是注釋,以前也講過(guò),這里用不上一些代碼了,但是UP又覺(jué)得未來(lái)可能有用,所以就注釋掉,而不是直接刪掉,這是寫(xiě)程序的經(jīng)驗(yàn),請(qǐng)學(xué)習(xí)。

print是什么意思就不再?gòu)?qiáng)調(diào)了,曾經(jīng)UP說(shuō)過(guò),要學(xué)會(huì)用unity寫(xiě)程序,這個(gè)是必會(huì)知識(shí)。
運(yùn)行程序,看看左下角,你有發(fā)現(xiàn)控制臺(tái)上輸出了什么嗎,UP就不再解釋了,相信到這里聰明的你自然明白這個(gè)是怎么實(shí)現(xiàn)的。


用UI顯示出來(lái)打印的分?jǐn)?shù)
于是UP回憶起了當(dāng)時(shí)寫(xiě)過(guò)的文章,雖然這個(gè)項(xiàng)目暫時(shí)放棄了,但是依然告知了如何做UI。

于是UP就使用了超能力,讓主界面瞬間產(chǎn)生了變化!(快醒醒,哦不,人不中二怎么做游戲)

接下來(lái)我們要新建個(gè)腳本,叫做mailUI,主界面UI,首先我們?cè)谝梦募锛?行
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//--------上面是創(chuàng)建時(shí)自帶的,下面是我們加的-------//
using UnityEngine.UI;
using UnityEngine.Events;
加了UI的引用,才可以設(shè)置UI的文字變化,加了Events才可實(shí)現(xiàn)按鈕效果,所以先都加上來(lái)吧。
然后把mainUI腳本拖到Canvas上,這里就不截圖了,因?yàn)閁P已經(jīng)操作過(guò)許多這種操作了(其實(shí)主要還是B站專欄截圖即貼圖功能失效了,懶)
加入代碼
public GameObject socres; //把UI中的scores拖進(jìn)來(lái)
然后在unity中拖:

可能有老司機(jī)說(shuō),可以用GameObject.Find這種功能查找模塊,不過(guò)有大神說(shuō),盡量不要用這個(gè)功能來(lái)執(zhí)行其他的操作,比較耗資源,所以UP就盡量不用了,除非是判斷某個(gè)物體是否存在于游戲場(chǎng)景中,否則不用。
我們?cè)赨pdate里加一段代碼:socres.GetComponent<Text>().text = gameConfig.scores.ToString();,然后運(yùn)行一下

是的,這段代碼的意思就是將gameConfig.scores所顯示的文字賦予給UI里的text。

點(diǎn)擊特效
其實(shí)這個(gè)要實(shí)現(xiàn)也很簡(jiǎn)單,我們需要了解unity里自帶的粒子效果編輯器。

粒子效果器初始的效果是這樣的,我們改個(gè)顏色讓大家看的更清楚

這個(gè)工具挺復(fù)雜的,具體每一條的意思大家可以去搜索一下,最終UP也是瞎調(diào),搞出了個(gè)這樣的效果。


然后大家也應(yīng)該發(fā)現(xiàn)了,這個(gè)粒子效果器只是游戲里的一個(gè)組件,我們需要將其封裝起來(lái),不知大家還是否記得prefab,上一期里有提到。

然后我們改改腳本
之前我們有一段這個(gè)代碼,意思是點(diǎn)擊到氣球時(shí),清除氣球
if (hit.collider.gameObject.transform.name == "redBall(Clone)")
{
Destroy(hit.collider.gameObject);
}
我們現(xiàn)在則需要在這一段代碼上增加新功能,在刪除氣球的同時(shí)增加爆炸特效。
其實(shí)這個(gè)實(shí)現(xiàn)方法,如果各位看過(guò)上一期,那么相信你應(yīng)該會(huì)怎么做了,就是這樣:
先把生成一個(gè)氣球的代碼Instantiate(ball, new Vector2(Random.Range(-2.3f, 2.4f), -6), transform.rotation);復(fù)制過(guò)來(lái)
然后創(chuàng)建一個(gè)gameObject組件叫做boomEffect
把prefab拖進(jìn)boomEffect
把上面那行代碼的ball改成boomEffect,再修改下位置 Instantiate(boomEffect, hit.collider.gameObject.transform.position, transform.rotation);。
基本上使用復(fù)制粘貼技巧就完工了
之后運(yùn)行的效果是這樣的,但是會(huì)發(fā)現(xiàn)有BUG

我們來(lái)解決下BUG,其實(shí)最大的問(wèn)題是沒(méi)有關(guān)閉粒子效果器的loop模式,我們?cè)僬{(diào)節(jié)下參數(shù)。

然后運(yùn)行

看起來(lái)好像完美了,實(shí)際還有個(gè)問(wèn)題,我們看看程序運(yùn)行畫(huà)面

有許多長(zhǎng)得像忍者鏢形狀的東西,其實(shí)這些就是粒子觸發(fā)器,如果存在太多的話也會(huì)影響游戲效率,所以我們要清除它。
新建腳本,寫(xiě)法如圖

可能有人會(huì)問(wèn),為什么還要寫(xiě)個(gè)load方法,不可以直接寫(xiě)在update里么,不可以,會(huì)報(bào)錯(cuò),具體為什么其實(shí)UP也不是很清楚,只知道必須要這樣寫(xiě)。

結(jié)尾
好了,到這里差不多可結(jié)束了,看起不多的文字UP可花了一個(gè)下午的時(shí)間才寫(xiě)完,那么我們依然要繼續(xù)為下一期挖坑。
失敗的功能怎么實(shí)現(xiàn)(其實(shí)都是用之前教的辦法復(fù)制粘貼就可以實(shí)現(xiàn)哦)
【策劃篇】如何讓游戲變得更有趣
因?yàn)榻貓D量不是很夠,所以有可能會(huì)不知道某些代碼寫(xiě)在什么地方,不過(guò)UP已經(jīng)把代碼放在git上了,大家可以去git看源文件。