昨天,我們製作了通關的 UI 畫面,並且幫這個畫面加上了一點小小的漸變動畫,寫了一些程式來檢測玩家是否通關。
今天我們要來製作更多的場景,並且讓玩家在通過關卡之後可以自動進入下一關!
想要製作更多的關卡,最簡單的方式就是複製當前的 Scene ,並且再做一些小修改,而這也是我們接下來要做的。但在我們這麼做之前,我們要先幫場景中的一些物件都建立一個 Prefab ,原因是因為如果不使用 Prefab ,各個場景中的物件就都不相關,這時候如果想調整相機位置、玩家前進的速度、左右移動的靈敏度等等,就會非常麻煩,因為我們需要逐個場景的調整,建立一個 Prefab 使我們只需要在 Prefab 上更改,它會自動套用到由這個 Prefab 建立的所有物件。
建立 Prefab 一樣很簡單,就像之前建立 Obstacle
的 Prefab 一樣,我們把場景中所有可以調整參數的物件都選取起來(例如:GameManager
、Main Camera
、Player
、Canvas
、End
)並拖曳到 Prefab
資料夾內
這樣就成功建立了所有物件的 Prefab
在每次通關之後,除了顯示通關畫面之外,還要準備切換到下一關,我們希望他能在顯示通關畫面兩秒之後自動切換到下一關,想要實現這樣的效果我們可以從 Animation
下手。
選取之前設置在 Canva
底下的 Level Complete
的 Panel 後,再回到 Animation 面板,就可以看到我們之前加入的動畫了。把時間軸拉到第三秒的位置(每秒 60 張的話就是第 180 格),並且按下 Add Event
的按鈕
點選創建出來的小標誌之後,在右邊可以看最上面有一個 Function 的欄位,表示我們可以在這個 Event 中選擇要執行的函式,所以我們接下來要來寫載入新場景的程式碼!
對這個 Level Complete
建立一個小小的程式,命名為 LevelComplete.cs
,內容很簡單,就是提供一個 Method 來讓我們能夠從剛剛的 Function 欄位中來選擇。
// LevelComplete.cs
using UnityEngine;
using UnityEngine.SceneManagement;
public class LevelComplete : MonoBehaviour
{
public void LoadNextLevel()
{ SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
}
解釋一下這裡的程式碼,就像【Day 19】使用到的重啟場景的功能,我們如果要切換場景,也一樣要使用到 SceneManager
,同樣要記得在最上方寫上 using UnityEngine.SceneManageent;
。相比之前不同的是,我們原本在 SceneManager.LoadScene()
中的括號裡面填入我們要 Load 的場景名稱,這次我們 Load 場景的 buildIndex。
level_01
的 buildIndex 是 0 ,level_02
的 buildIndex 是 1 ,以此類推。為了示範方便這裡現在有三個 Scene ,等等我們會來建立這三個 Scene
所以我們使用 SceneManager.GetActiveScene().buildIndex
來獲取當前 Scene 的 buildIndex 值,然後 + 1,表示我們要載入下一個場景。
接著我們來建立更多的關卡,在 Scenes
資料夾點選當前的場景並且按下 Ctrl + D
來複製一個一模一樣的場景,取名為 Level_02。也可以複製多次來建造更多的關卡。
點兩下 level_02
的 Scene 來開啟,畫面當然沒有任何不同,因為這是我們複製 level_01
的,但我們可以在視窗左上角看到我們已經開啟了 level_02
的場景
在這裡,我總共複製了三個關卡,接著我們就可以分別對這些場景中的障礙物進行微調。我讓關卡中的障礙物越來越多,使玩家在越高 level 的關卡越難通過,記得每次切換場景之前都要存檔。
現在進行遊戲就可以發現我們能夠正常跳關了!但是當我們結束第三關的關卡的時候,程式就會跳出錯誤,因為他想要切換到下一個場景,但我們並沒有更多的場景讓 Unity 來切換。不過沒關係,明天我們將來處理這個問題,明天我們要來加入 Welcome Page 和 Credits Page ,作為這次小實作最後的收尾!