第 5 部分:新增金幣和點數
簡介
完成第 4 部分後,你現在應該已經有一個關卡和一個可以跑跳的遊戲角色。
接下來,我們要讓玩家有明確的目標。在本篇教學中,我們會加入可收集的金幣,以及用來追蹤金幣數量的分數。
藏在磚塊裡的金幣是 Mario 最具代表性的特色之一。就讓我們從製作這個功能開始吧。
把金幣藏在磚塊裡
敲擊磚塊
我們會先製作一個磚塊,讓它之後可以快速調整,以容納所需數量的金幣。磚塊完成後,你就可以複製它,並放到想要的位置。
本篇教學會延續第 4 部分的內容,並假設你已從 Hub 分支建立第 4 部分的專案。
先選取一個要放入金幣的磚塊。在物件屬性中,點選「Behaviors」按鈕,開啟行為編輯器。
在 Object 類別中,加入 Collided 行為。每當兩個指定的物件互相接觸時,Collided 行為就會觸發事件。
點選你加入的 Collided 行為,查看它的屬性。你會看到兩個可供選取物件的欄位(分別稱為 Object A 和 Object B)。第一個欄位(Object A)已經為你選取,也就是套用這些行為的物件。你可以點選欄位來更改,不過我們先維持原樣。
空白欄位是第二個物件(Object B),Collided 行為會以它來進行判定。點選空白欄位,然後選取你在本指南第 4 部分加入的玩家角色。
選好物件後,你就可以設定 Object B 的哪個部位會觸發碰撞事件。關閉所有切換選項,只保留「On Top」。現在,只有玩家角色的頭頂碰到磚塊時,Collided 行為才會生效。
現在磚塊會檢查玩家的頭是否碰到它,接著我們要讓磚塊上下彈跳。為此,我們會使用 Move By 行為,先將磚塊往上移,再移回原位。
在 Transform 類別中加入 Move By 行為,並將它連接到先前加入的 Collided 行為。
點選 Move By 行為,查看它的屬性。由於我們希望玩家敲到磚塊時,磚塊會向上移動,因此要更改 Y Value。將數值設得小一些,因為我們只想讓磚塊輕微彈起。我使用的是 0.20 公尺。
你也需要更改 Duration。Duration 是完成移動所需的時間。預設值為 1,也就是說,磚塊會在 1 秒內移動 0.2 公尺。這對我們的需求來說太慢了。請將 Duration 改為 0.10 秒。
**注意:**若將 Duration 設為 0,物件會立即移至新位置,不會平順地播放動畫。另外,請留意標示為「Linear」的方框。這是套用在移動上的動態補間效果。如果行為有設定 Duration,物件就會依照這個效果移動。
接著,為了讓磚塊彈回原位,再加入一個 Move By 行為,並將它連接到前一個行為。
再次更改屬性。這次我們要讓磚塊往下移。要讓磚塊向下移動,請將 Y Value 設為負數。由於我們要讓磚塊回到原位,因此將移動值設為 -0.20 公尺。Duration 也要改為 0.10 秒。
到這個階段,如果按下播放,玩家就可以從下方敲擊磚塊,讓磚塊上下彈跳。不過,我們還需要處理幾個問題。
-
我們的邏輯有個小問題。如果玩家一直快速跳躍,不等磚塊回到原位,磚塊就會持續往上移動。
-
磚塊會無限次彈跳。如果只想讓磚塊提供幾枚金幣,金幣用完後就停止呢?
-
目前還不會給玩家金幣。
先來處理問題 1。這個錯誤很容易修正:只要在玩家敲到磚塊時關閉碰撞行為,等磚塊移動完成後再重新開啟即可。
要這麼做,請切換到 Custom 類別,加入「Behavior Off」,然後將它連接到 Collided 行為。
接著,在 Behavior Off 屬性中,點選標示為「Select Behavio r」的空白欄位。在清單中找到正確的 Collided 行為。請注意,清單會顯示所有物件的所有行為,並依物件名稱排序。
現在,你需要在磚塊彈跳結束時重新開啟 Collided 行為。只要從 Custom 類別加入 Behavior On,並將它連接到第二個 Move By 行為即可。在行為屬性中,請務必選取要重新開啟的 Collided 行為。
對於問題 2,我們會使用方塊容器來設定每個磚塊所含的金幣數量。這樣就能輕鬆地調整個別磚塊,讓它含有較多或較少的金幣。
首先,從 Custom 類別加入一個方塊容器。它可以放在畫面上的任何位置,因為不需要連接其他項目。你也可以將這個方塊容器重新命名為「Coins」,方便之後尋找(如需了解如何重新命名行為,請參閱第 4 部分)。
在 Coins box container 的行為屬性中,將「Default Value」屬性改為 3。這就是磚塊內含的金幣數量。
接著,從 Logic 類別加入 Add Values 行為,並將它連接到稍早加入的第二個 Move By 行為。我們會用這個 Add Values 行為來記錄玩家敲擊磚塊的次數。
連接好「Add Values」行為後,點選它以查看行為屬性。屬性中有兩個輸入欄位,而 Add Values 行為會輸出所輸入數值的總和。
在這裡,我們會用加總值來記錄每次敲擊,因此在上方欄位輸入 1,並將 Add Values 行為的輸出總和傳回下方的輸入欄位。
這麼做會在每次執行此行為時,將總和加 1。第一次執行時,因為沒有先前的總和,所以會計算 1+0。第二次執行時,會使用上次儲存的總和,因此會計算 1+1。
接下來,你需要檢查 Add Values 的總和是否等於先前加入的 Coins 方塊容器中的數值。
要做到這點,請從 Logic 類別加入 IF 行為,並將它連接到上一步的 Add Values。
連接好 IF 後,點選它以查看行為屬性。IF 行為會根據兩個輸入欄位和所選條件,檢查特定條件是否成立。
在這個例子中,我們會輸出(分享)Add Values 行為的總和,並將它放入 IF 的第一個欄位。
然後將方塊容器的內容輸出到第二個欄位。
輸入這些值後,只有在 Add Values 的總和等於 Coins 方塊容器中儲存的數值時,下一個連接的行為才會執行。
現在,你需要關閉 Collided 行為,並更換圖像,這樣玩家就無法再取得金幣。要做到這點,請從 Custom 類別加入新的 Behavior Off 行為,並將它連接到 IF。和之前一樣,選取要關閉的 Collided 行為。
若要讓玩家知道金幣已經用完,你可以從 Transform 類別加入 Change Graphic 行為,並將它連接到 IF。
連接後,在 Change Graphic 行為屬性中選取新的圖像。點選行為屬性中的第二個欄位,再選取新的圖像。
現在按下播放,你就可以跳起來敲擊磚塊 3 次,之後磚塊就會停止。
獲得分數
設定 UI
接下來要做的,就是讓玩家敲擊磚塊時真的能獲得分數和金幣!
首先,我們要在畫面角落加入一個計數器,讓玩家知道目前有幾分。
按下返回,從行為編輯器回到主編輯器。接著,點選畫面右側的三個點,開啟 Layers 列(也可以從畫面邊緣向內滑動)。
選取 Global UI 圖層。UI 圖層位於場景中的其他圖層之上,通常用於按鈕、搖桿和標籤。它們也會固定在畫面上的同一位置,看起來會隨著場景中的其他內容移動。
注意:放在 Global UI 圖層上的物件會出現在專案的每個場景中。如果只想讓某個物件出現在單一場景中,請使用 Scene UI 圖層。
選取 Global UI 圖層後,點選 Dock 上的 Special Objects 燒瓶圖示,或將它拖曳到場景中。
在彈出視窗中選取 Label,標籤就會放入場景中。
點選新加入的標籤,開啟物件屬性。在標籤屬性中,你可以更改文字顏色、字型、顯示文字等。
點選大型文字方框,並將文字改為「Points:」。
接著,點選「Alignment」展開對齊屬性。將 Width 設為 110,並將 Height 設為 64。
注意:將這些值設為 0,會移除文字區域,讓文字可以無限制地向水平方向延伸。
完成標籤屬性設定後,使用 Move/Transform 工具將新標籤移到畫面角落,並確認它不會遮擋玩家的視線。
標籤擺放好之後,再加入另一個標籤,用來顯示分數。這次將文字設為 0,因為玩家一開始的分數是零。和前一個標籤不同,這次我們要設定指定的寬度和高度。將 Width 設為 500pt,Height 設為 64pt。這會指定文字顯示區域;如果文字太多而無法放進此區域,就會被截斷。
另外,將水平對齊方式設為靠左對齊(Flush Left)。
完成標籤屬性設定後,將它放在「Points」標題旁邊。
獲得分數
現在,我們要讓玩家每次獲得金幣時,分數都會增加。切換回主圖層,並重新開啟藏有金幣的磚塊之行為,加入必要的行為。
從 UI 類別拖入「Add To Score」行為,並將它連接到本指南稍早加入的第二個 Move By 行為。
接著,點選 Add To Score 行為,開啟 Infinite Score 切換選項。如果這個選項沒有開啟,達到指定分數時就會觸發下一個行為。另外,也請確認已選取「0」標籤作為正確物件,因為 Add To Score 行為會自動選取場景中的任意標籤。
現在按下播放,玩家每次敲擊磚塊就會獲得 1 分。
現在你可以複製這個磚塊(如第 3 部分所學),再把它放到關卡各處。
單獨放置金幣
你的第一枚金幣
有時候,你可能想在關卡各處直接放置金幣,而不是把它們藏在磚塊裡。這個做法相當簡單,接下來我們就會說明。
先將金幣圖像加入場景,然後點選它以查看物件屬性。
在物件屬性底部,確認已選取 physics 分頁。
在 physics 分頁中,將金幣設為可穿透。這樣玩家就能直接穿過金幣,不會被擋住或減速。
接著,我們要調整金幣的碰撞邊界。碰撞邊界定義物件的實體形狀;它的大小或形狀可能與物件的視覺外觀不同。要調整碰撞邊界,請點選 Collisions 圖示。
在 Collision Editor 中,你可以使用左側工具列的工具來修改並建立獨特的碰撞形狀。
本指南中,我們會選取「Circle」選項來建立圓形碰撞邊界。
接著,拖曳圓形上的綠點,調整碰撞邊界的大小。讓碰撞邊界與金幣大小相同。請注意,如果碰撞邊界比物件大,玩家在實際碰到中央的金幣圖像之前,就能與金幣互動。
完成碰撞邊界設定後,點選工具列中的勾選圖示,確認並儲存新的形狀。
再次點選金幣,查看物件屬性。這次請開啟金幣的行為編輯器。
從 Object 類別將「Collided」行為加入畫面。和之前一樣,開啟 Collided 行為屬性,並將 Green Spaceman 玩家選為 Object B。
接著,從 UI 類別拖入 Add to Score 行為,並將它連接到 Collided 行為。同樣地,在行為屬性中開啟 Infinite Score 切換選項,並確認已選取正確的分數標籤。
最後,從 Object 類別加入 Destroy Object 行為,並將它連接到 Collided 行為。玩家碰到金幣時,這個行為會立即將金幣完全移除。
按下播放後,玩家現在可以碰到金幣,金幣也會隨之消失。
就這樣!現在你的平台遊戲已經有可收集的金幣了。接下來只要複製金幣,並將它們放到關卡各處即可。放置金幣時,試著發揮創意!
你可以從 Hub 下載第 5 部分的完成版本,看看實際效果。
在第 6 部分中,我們會加入敵人,讓遊戲更有挑戰性。


