編寫遊戲循環

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

資料已建立後,就該開始建立指定的指令碼了。這個課程剩下的部分將會重點討論眾多元素的指令碼。

設置指令碼

戰鬥競技將使用模組腳本和普通腳本的組合。以下是腳本和其功能。

遊戲管理器指令碼。 運行從遊戲設定中變量的 Match Manager 功能
匹配管理器模組腳本。執行像將玩家送入競技場或追蹤時間在相符賽中的功能。
遊戲設定模組腳本。儲存常常被其他腳本使用的變數。

GameSettings 指令碼

建立名為 GameSettings 的模組指令,儲存其他指令所使用的變數,例如比賽和中場時間。這些變數稍後將被 GameManager 指令使用。

  1. ServerStorage 中,建立名為 ModuleScripts 的文件夾。在該文件夾中,建立名為 GameSettings 的新模組腳本。

  2. 開啟 GameSettings 並重新命名模組表,以符合指令碼的名稱。


    local GameSettings = {}
    return GameSettings
  3. 在模組表中,為以下使用添加變數。對於每個值,您可以稍後變更它,直到您測試。

    • 中場休息時間 - 秒待玩家在相符賽前。
    • 比賽時效 - 比賽時效的長度。
    • 最低玩家 - 最小玩家需要啟動。
    • 轉換時間 - 在秒鐘內前後的時間。使遊戲循環的零件之間的轉換更為順滑。

    local GameSettings = {}
    -- 遊戲變量
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

MatchManager 指令碼

遊戲管理器與匹配器是連接到第二個指令碼的遊戲管理器。這個指令碼處理任務,例如啟動計時器或重設玩家一旦比賽結束。

在 MatchManager 裡,有一個名為 prepareGame() 的函數,會以將玩家轉換為相符賽開始遊戲。

  1. 在 ServerStorage > ModuleScripts > 添加名為 MatchManager 的模組脚本。 重命名模組表。


    local MatchManager = {}
    return MatchManager
  2. 增加名為 prepareGame() 的新模組功能。包括一個 print 語句以測試指令碼。


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

編寫遊戲循環

主要遊戲循環將在 GameManager 指令碼中使用剛創建的變量來編寫。記住,遊戲循環有三個階段:中場休息、比賽和清理和重置。

GameManager 指令碼

這個指令碼是一個普通的服務器指令碼,所以請將它放在 ServerScriptService 裡,而不是模組指令碼夾套。 遊戲內部循環將在一段時間內真的循環。

  1. 在 ServerScriptService 中,創建名為 GameManager 的新指令碼。

  2. 為 "ServerStorage" 服務增加變數,這是 Modulescripts 的地方。然後增加 "Players" 服務的變數,以便在中場休息時檢查玩家數量。


    -- 服務
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. 要使用以前創建的模組:

    • moduleScripts 變數設置在 ModuleScripts 資料樣本的位置。
    • 增加名為 matchManagergameSettings 的變數。將每個變數設置為需要其相關指令碼。

    -- 服務
    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"))
  4. 在變數之後,加入一個 while true do 循環。 所有遊戲循環的所有階段都會進入內部重複無限。


    -- 模組指令碼
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- 主要遊戲循環
    while true do
    end

編寫中場休息

遊戲 loop 在無限運行時,中場休息應該暫停循環,只有足夠的玩家才能開始對相符。要代碼這個暫停,請在主線圈中包含一個雙重複的循環。該雙重複的循環會重複直到有足夠的玩家,直到主線圈退出並轉換玩家進入對相符。

重複循環 ,代碼在循環中至少會執行一次。與時間循環不同,它不會檢查它的狀態直到循環結束。這確保玩家在比相符開始前總是去大廳。

  1. while true do 循環中,輸入 repeat 並按下 輸入 以自動完成關鍵字 1>til1>。


    while true do
    repeat
    until
    end
  2. 檢查目前的玩家數量 (#Players:GetPlayers()) 是否大於或等於遊戲設定模組中創建的 minimumPlayers 變量。


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. 在重複循環中,添加一個打印聲明說明中場休息即將開始。使用 task.wait() 暫停打印,使用 intermissionDuration 從遊戲設定中使用。


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. 測試並確認印記聲明 "Starting intermission" 顯示至少兩次。查看訊息兩次讓重複循環找到足夠的玩家並重新執行。你必須等待恢復時間才能看到訊息第二次。

排障提示

如果您未能按照預期重新生成,請嘗試以下一項。

  • task.wait() 應該位於重複模式內。沒有等待,腳本將在一秒鐘內執行太多次,導致 Roblox Studio 超載並導致錯誤。
  • 在遊戲設定模塊中,變量 intermissionDuration 應大於 1 。如果小於 1 ,則會發生重複的情況,導致減速問題。

結束中場休息

一旦有足夠的玩家,請等待他們稍短的轉換時間。然後,在 MatchManager 中呼叫 prepareGame() 函數來將他們傳送到比賽。記住,這個函數只是列出一個線,但你稍後會添加更多代碼。

  1. 在重複子圈結束時,添加一個打印聲明說明中場休息結束,以便測試您的代碼。然後,使用 task.wait() 使用遊戲設定的 transitionTime 變量來跟隨它。


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. 在等待後,從 matchManager 模組呼叫 準備遊戲。當代碼執行時,這會只將文字打印到輸出窗口。等待下一個部分來測試此代碼。


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

測試多人遊戲

現在,要使代碼執行 prepareGame() ,需要退出重複循環。但要做到這一點,必須有更多 than 一名玩家。這意味著如果您使用 playtest 按鈕,功能將永遠不會執行,因為您是遊戲中唯一的玩家 (除非您的最低玩家是一個)。要測試此點,您需要模擬多人�����

開始本地伺服器

要測試需要超過一名玩家的代碼,請創建本地伺服器。 遊戲發佈通常在 Roblox 伺服器上,但在本地伺服器上,玩家將以模擬人偶在您的電腦上模擬玩。

  1. 要開始本地服務器,請在 測試 標籤> 客戶和伺服器 區域> 設置玩家下拉列表到遊戲設定的最低 Players 數量。此課程使用 2 個玩家。

  2. 按一下開始來開始伺服器。

  3. 等待伺服器設定。多個視窗將會在您的原始 Studio 視窗上開啟。您可能需要允許從 firewalls 或其他線上安全軟件來訪問 Roblox Studio。

排障提示

在這個時候,您無法查看測試服務器,請試一下以下。

  • 如果您有伺服器啟動的問題,請重新檢查文章Firewall and Router Issues
  • 將玩家數量設置為小數量,例如 2 或 3。
  • 如果問題仍未解決,請嘗試重新啟動 Studio 或重新啟動您的電腦。

在本地伺服器上測試

當服務器開始時,您會看到多個窗口。每個窗口代表一個不同的服務器/客戶端關係。

  • 伺服器 (綠色邊框) 執行遊戲。
  • 客戶端 (藍色邊框) 模擬玩家的體驗。
綠色邊界的伺服器
客戶端有藍色邊框

當服務器上線時,您可以檢查代碼是否運行。

  1. 尋找綠色邊框的 服務器 窗口。檢查從 MatchManager 指令碼中呼叫的列印聲明。因為存在重複循環,因此你會看到相同的列印聲明重複。

  2. 完成測試後,在任何視窗中關閉伺服器按鈕。這會關閉所有伺服器和客戶端視窗,並且將您帶回到您的普通 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 do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("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 = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings