資料已建立後,就該開始建立指定的指令碼了。這個課程剩下的部分將會重點討論眾多元素的指令碼。
設置指令碼
戰鬥競技將使用模組腳本和普通腳本的組合。以下是腳本和其功能。
遊戲管理器 | 指令碼。 運行從遊戲設定中變量的 Match Manager 功能 |
匹配管理器 | 模組腳本。執行像將玩家送入競技場或追蹤時間在相符賽中的功能。 |
遊戲設定 | 模組腳本。儲存常常被其他腳本使用的變數。 |
GameSettings 指令碼
建立名為 GameSettings 的模組指令,儲存其他指令所使用的變數,例如比賽和中場時間。這些變數稍後將被 GameManager 指令使用。
在 ServerStorage 中,建立名為 ModuleScripts 的文件夾。在該文件夾中,建立名為 GameSettings 的新模組腳本。
開啟 GameSettings 並重新命名模組表,以符合指令碼的名稱。
local GameSettings = {}return GameSettings在模組表中,為以下使用添加變數。對於每個值,您可以稍後變更它,直到您測試。
- 中場休息時間 - 秒待玩家在相符賽前。
- 比賽時效 - 比賽時效的長度。
- 最低玩家 - 最小玩家需要啟動。
- 轉換時間 - 在秒鐘內前後的時間。使遊戲循環的零件之間的轉換更為順滑。
local GameSettings = {}-- 遊戲變量GameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
MatchManager 指令碼
遊戲管理器與匹配器是連接到第二個指令碼的遊戲管理器。這個指令碼處理任務,例如啟動計時器或重設玩家一旦比賽結束。
在 MatchManager 裡,有一個名為 prepareGame() 的函數,會以將玩家轉換為相符賽開始遊戲。
在 ServerStorage > ModuleScripts > 添加名為 MatchManager 的模組脚本。 重命名模組表。
local MatchManager = {}return MatchManager增加名為 prepareGame() 的新模組功能。包括一個 print 語句以測試指令碼。
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
編寫遊戲循環
主要遊戲循環將在 GameManager 指令碼中使用剛創建的變量來編寫。記住,遊戲循環有三個階段:中場休息、比賽和清理和重置。
GameManager 指令碼
這個指令碼是一個普通的服務器指令碼,所以請將它放在 ServerScriptService 裡,而不是模組指令碼夾套。 遊戲內部循環將在一段時間內真的循環。
在 ServerScriptService 中,創建名為 GameManager 的新指令碼。
為 "ServerStorage" 服務增加變數,這是 Modulescripts 的地方。然後增加 "Players" 服務的變數,以便在中場休息時檢查玩家數量。
-- 服務local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")要使用以前創建的模組:
- 將 moduleScripts 變數設置在 ModuleScripts 資料樣本的位置。
- 增加名為 matchManager 和 gameSettings 的變數。將每個變數設置為需要其相關指令碼。
-- 服務local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- 模組指令碼local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))在變數之後,加入一個 while true do 循環。 所有遊戲循環的所有階段都會進入內部重複無限。
-- 模組指令碼local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- 主要遊戲循環while true doend
編寫中場休息
遊戲 loop 在無限運行時,中場休息應該暫停循環,只有足夠的玩家才能開始對相符。要代碼這個暫停,請在主線圈中包含一個雙重複的循環。該雙重複的循環會重複直到有足夠的玩家,直到主線圈退出並轉換玩家進入對相符。
有 重複循環 ,代碼在循環中至少會執行一次。與時間循環不同,它不會檢查它的狀態直到循環結束。這確保玩家在比相符開始前總是去大廳。
在 while true do 循環中,輸入 repeat 並按下 輸入 以自動完成關鍵字 1>til1>。
while true dorepeatuntilend檢查目前的玩家數量 (#Players:GetPlayers()) 是否大於或等於遊戲設定模組中創建的 minimumPlayers 變量。
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersend在重複循環中,添加一個打印聲明說明中場休息即將開始。使用 task.wait() 暫停打印,使用 intermissionDuration 從遊戲設定中使用。
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersend測試並確認印記聲明 "Starting intermission" 顯示至少兩次。查看訊息兩次讓重複循環找到足夠的玩家並重新執行。你必須等待恢復時間才能看到訊息第二次。
排障提示
如果您未能按照預期重新生成,請嘗試以下一項。
- task.wait() 應該位於重複模式內。沒有等待,腳本將在一秒鐘內執行太多次,導致 Roblox Studio 超載並導致錯誤。
- 在遊戲設定模塊中,變量 intermissionDuration 應大於 1 。如果小於 1 ,則會發生重複的情況,導致減速問題。
結束中場休息
一旦有足夠的玩家,請等待他們稍短的轉換時間。然後,在 MatchManager 中呼叫 prepareGame() 函數來將他們傳送到比賽。記住,這個函數只是列出一個線,但你稍後會添加更多代碼。
在重複子圈結束時,添加一個打印聲明說明中場休息結束,以便測試您的代碼。然後,使用 task.wait() 使用遊戲設定的 transitionTime 變量來跟隨它。
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)end在等待後,從 matchManager 模組呼叫 準備遊戲。當代碼執行時,這會只將文字打印到輸出窗口。等待下一個部分來測試此代碼。
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
測試多人遊戲
現在,要使代碼執行 prepareGame() ,需要退出重複循環。但要做到這一點,必須有更多 than 一名玩家。這意味著如果您使用 playtest 按鈕,功能將永遠不會執行,因為您是遊戲中唯一的玩家 (除非您的最低玩家是一個)。要測試此點,您需要模擬多人�����
開始本地伺服器
要測試需要超過一名玩家的代碼,請創建本地伺服器。 遊戲發佈通常在 Roblox 伺服器上,但在本地伺服器上,玩家將以模擬人偶在您的電腦上模擬玩。
要開始本地服務器,請在 測試 標籤> 客戶和伺服器 區域> 設置玩家下拉列表到遊戲設定的最低 Players 數量。此課程使用 2 個玩家。
按一下開始來開始伺服器。
等待伺服器設定。多個視窗將會在您的原始 Studio 視窗上開啟。您可能需要允許從 firewalls 或其他線上安全軟件來訪問 Roblox Studio。
排障提示
在這個時候,您無法查看測試服務器,請試一下以下。
- 如果您有伺服器啟動的問題,請重新檢查文章Firewall and Router Issues。
- 將玩家數量設置為小數量,例如 2 或 3。
- 如果問題仍未解決,請嘗試重新啟動 Studio 或重新啟動您的電腦。
在本地伺服器上測試
當服務器開始時,您會看到多個窗口。每個窗口代表一個不同的服務器/客戶端關係。
- 伺服器 (綠色邊框) 執行遊戲。
- 客戶端 (藍色邊框) 模擬玩家的體驗。
當服務器上線時,您可以檢查代碼是否運行。
尋找綠色邊框的 服務器 窗口。檢查從 MatchManager 指令碼中呼叫的列印聲明。因為存在重複循環,因此你會看到相同的列印聲明重複。
完成測試後,在任何視窗中關閉伺服器按鈕。這會關閉所有伺服器和客戶端視窗,並且將您帶回到您的普通 Studio 視窗。
排障提示
如果沒有顯示預期的列印聲明,請從以下列中嘗試。
- 檢查 prepareGame() 等功能是否在 while 真的做循環內。
- 如果 MatchManager 的列印沒有工作,請確認一些常見的解決方案,例如確認 MatchManager 指令是否在 GameManager 中需要或是否添加 prepareGame() 到該模組的表。
已完成的指令碼
下面是完成審核您的工作的指令碼。
GameManager 指令碼
-- 服務local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- 模組指令碼local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- 主要遊戲循環while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
MatchManager 指令碼
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
GameSettings 指令碼
local GameSettings = {}-- 遊戲變量GameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings