到底是有多少功能,需要使用“系統(tǒng)”來形容?其實(shí)功能非常簡單,使用“系統(tǒng)”來形容開發(fā)任務(wù)能夠讓你更加“系統(tǒng)化”的去開發(fā)這個(gè)功能,你就會(huì)考慮的更加全面。例如換一種說法:添加一個(gè)小小的計(jì)分功能,那么在開發(fā)過程中,這個(gè)功能可能得不到你的重視,然后就會(huì)很隨便的寫一下,實(shí)現(xiàn)功能即可。
我以前剛學(xué)編程的時(shí)候,我會(huì)在房間門口貼著“貝爾實(shí)驗(yàn)室”,因?yàn)镃語言是從這里誕生的,在房間敲代碼時(shí)專注度非常高。
那么,分析一下該“系統(tǒng)”該如何實(shí)現(xiàn)?
首先,需要顯示分?jǐn)?shù)的地方有2個(gè):當(dāng)前分?jǐn)?shù)和最高分?jǐn)?shù)。
然后,更新分?jǐn)?shù)的地方有3個(gè):
游戲啟動(dòng):從存檔讀取上一次分?jǐn)?shù),沒有則設(shè)置為0
消除時(shí):消除時(shí)增加分?jǐn)?shù),如果分?jǐn)?shù)高于歷史,則同時(shí)更新最高分
重置游戲時(shí):當(dāng)前分?jǐn)?shù)歸零,最高分保存不變
按這么算,即使是最復(fù)雜的情況也可能不到10行代碼(不計(jì)算初始化對象)。所以直接寫在導(dǎo)演類中就可以了,不需要單獨(dú)分離一個(gè)類來處理。
開始實(shí)現(xiàn):
01.綁定對象
將場景中的“當(dāng)前分?jǐn)?shù)”和“最高分?jǐn)?shù)”對象拖動(dòng)至導(dǎo)演類對應(yīng)的對象上:

02.添加成員
先添加“當(dāng)前分?jǐn)?shù)”和“最高分?jǐn)?shù)”對應(yīng)的腳本對象:
// 當(dāng)前分?jǐn)?shù)
public GameObject Score;
ScoreScreen _currentScore;
// 最高分?jǐn)?shù)
public GameObject HighScore;
ScoreScreen _highScore;
添加兩個(gè)表示分?jǐn)?shù)的成員變量。在添加這兩個(gè)變量時(shí)發(fā)現(xiàn)命名會(huì)與剛剛添加的腳本對象的引用產(chǎn)生沖突,經(jīng)過思索,決定添加一個(gè)后綴來區(qū)分,同時(shí)那些場景中對象引用的名稱也添加一個(gè)后綴與腳本名區(qū)分開來:
類似public GameObject ScreenMain;這種的變量名添加“Obj”,腳本引用添加“Script”:
// 主屏幕
public GameObject ScreenMainObj;
ScreenMain _screenMainScript;
// 附加屏幕
public GameObject ScreenAttachedObj;
// 當(dāng)前分?jǐn)?shù)
public GameObject ScoreObj;
ScoreScreen _currentScoreScript;
// 最高分?jǐn)?shù)
public GameObject HighScoreObj;
ScoreScreen _highScoreScript;
// 關(guān)卡
public GameObject LevelObj;
// 暫停提示
public GameObject PauseHintObj;
記得修改變量名后,導(dǎo)演對象中的對象引用需要重新指定。
然后這是新添加的兩個(gè)成員變量:
int _currentScore; // 當(dāng)前分?jǐn)?shù)
int _highScore; // 最高分?jǐn)?shù)
03.初始化新加的成員
// 初始化分?jǐn)?shù)
_currentScoreScript = ScoreObj.GetComponent<ScoreScreen>();
if (_currentScoreScript == null) return false;
_highScoreScript = HighScoreObj.GetComponent<ScoreScreen>();
if (_highScoreScript == null) return false;
_currentScoreScript.SetScore(_currentScore);
_highScoreScript.SetScore(_highScore);
04.在消除時(shí)更新分?jǐn)?shù)
為了讓計(jì)分看起來更精致,可以將更新分?jǐn)?shù)寫在ClearOnePoint()方法中,這樣,計(jì)分就好像多了動(dòng)畫一樣,而不是一下就跳到最終分?jǐn)?shù)。
// 更新分?jǐn)?shù)
_currentScore++;
if (_currentScore > _highScore) _highScore = _currentScore;
_currentScoreScript.SetScore(_currentScore);
_highScoreScript.SetScore(_highScore);
05.計(jì)分規(guī)則
通過判斷消除的行數(shù)來修改增加的分?jǐn)?shù):
消除1行:每個(gè)點(diǎn)增加1分,共增加10分
消除2行:每個(gè)點(diǎn)增加2分,共增加40分
消除3行:每個(gè)點(diǎn)增加3分,共增加90分
消除4行:每個(gè)點(diǎn)增加4分,共增加160分
// 更新分?jǐn)?shù)
switch (_needClearLines.Count)
{
case 1: _currentScore += 1; break;
case 2: _currentScore += 2; break;
case 3: _currentScore += 3; break;
case 4: _currentScore += 4; break;
}
if (_currentScore > _highScore) _highScore = _currentScore;
_currentScoreScript.SetScore(_currentScore);
_highScoreScript.SetScore(_highScore);
測試結(jié)果如下:

代碼鏈接:https://pan.baidu.com/s/1ji3nTes7Uwyn5KaqikBr8Q
提取碼:df5v