管理玩家

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

遊戲循環已經編寫好,是時候開始將其中的功能添加到它。在比相符中,玩家可以來來去前往。因此,代碼是用於任務,例如將玩家送入比賽和跟蹤已經啟用的玩家。要管理這些任務,請創建名為 PlayerManager 的模塊指令。

這個指令將啟動一個函數,以一個武器將玩家送入競技場,並在系列中擴展。

設置指令碼

因為玩家管理器包含其他指令碼的功能,所以它會是模組指令碼。

  1. 在 ServerStorage > ModuleScripts 中,添加名為 PlayerManager 的新模組腳本。然後,重新命名模組表以符合腳本名稱並添加對本地和模組功能的評論。


    local PlayerManager = {}
    -- 本地函數
    -- 模組功能
    return PlayerManager
  2. 為以追蹤中項目設定本地變量:

    服務:

    • 玩家 - 知道玩家是否已加入或離開遊戲。
    • ServerStorage - 玩家武器的儲存。

    地圖和玩家變數:

    • 大廳生成、競技區文件夾和競技區文件夾 - 用於傳送玩家到不同區域。
    • 一個元素陣列 - 跟蹤玩家在遊戲中的位置。

    local PlayerManager = {}
    -- 服務
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- 地圖變量
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- 玩家變數
    local activePlayers = {}
    -- 本地函數
    -- 模組功能
    return PlayerManager
  3. 在模組內建立名為 sendPlayersToMatch() 的模組功能,並且在測試版本中輸出。


    -- 本地函數
    -- 模組功能
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

在大廳中生成玩家

目前有多個重生位置,玩家重新加入遊戲時會在隨機位置重生。若要確保玩家在大廳中重生,請變更玩家的 RespawnLocation 屬性。

  1. onPlayerJoin() 中,用 player 的參數創建一個名為 player 的新本地函數。在那個函數中,設置玩家的重生位置為先前所做的大廳重生變量。


    -- 本地函數
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. 在模組功能底部添加事件區。然後,連接 onPlayerJoin() 到 Player Service 的 PlayerAdded 事件。


    -- 模組功能
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- 事件
    Players.PlayerAdded:Connect(onPlayerJoin)

連接和測試

現在模組可以連接和測試。 與 PlayerManager 創建後,請需要它,以便該模組的代碼在該模組的脚本中執行並發送玩家到大廳。

  1. 回到 匹配管理器 並為以追蹤中變量創建變數:

    • 服務器存儲 服務。
    • ModuleScripts 資料庫, 佈滿 ServerStorage 的子資料庫。
    • PlayerManager 模指令碼脚本,子模組Scripts。

    local MatchManager = {}
    -- 服務
    local ServerStorage = game:GetService("ServerStorage")
    -- 模組指令碼
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. 使用至少 最小玩家 的本地伺服器。確認您可以看到以追蹤中內容:

    • 所有玩家都會在大廳中重生。
    • PlayerManager 的輸出說明會出現在輸出窗口中。
  3. 完成後,按一下「清除」以關閉伺服器。

排障提示

在這個時候,部分指令碼的動作不是預期的,請嘗試以下一些方法。

  • 檢查如競技場、大廳或開始生成等零件的名稱,或者如果你在課程中命名它們,與教學中指示的不同。
  • 確認模組是否需要在每個使用 require() 函數和正確拼寫。

將玩家傳送到競技場

現在玩家會在大廳中生成,傳送他們到場上一旦中場休息結束。變更玩家的 RespawnLocation 為競技場地點,使用 ReloadCharacter() 函數將玩家傳送到場上。

  1. 去到 PlayerManager 指令碼,在 onPlayerJoin() 下,添加一個名為 preparePlayer() 的新本地功能。 包括兩個參數: 1> 玩家layer1> 和 4> whichSpawn4>,發送到的重生位置。


    local activePlayers = {}
    -- 本地函數
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- 模組功能
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. 將玩家的重生位置設置為 whichSpawn


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. 使用 LoadCharacter() 強制重新載入角色,並使用玩家的新位置重生。


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    end

將玩家傳送到產卵

確認每個玩家都被傳送到競技場中不同的重生位置,這是使用 for 循環來反復掃描已啟用的玩家陣列的所有值。使用 for 循環來允許腳本適應各種玩家數量。

  1. sendPlayersToMatch() 函數中,使用變數來創建所有競技場生成位置的列表,並且取得 Arena > SpawnLocations 夾中的兒童。


    --模組功能
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. 在下方加入 for 循環,以取得所有玩家的陣列,然後在每個玩家上執行此循環。要取得玩家,請輸入 Players:GetPlayers()


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    end
    end

追蹤和生成

遊戲執行時,需要確認哪些玩家正在進行遊戲,以便他們可以在競技場中生成。在回合開始時,每個玩家都會被追蹤在一個積分的玩家範圍內。這個積分將被用於不同的功能,例如傳送或分配武器,以確保在回合中仍有玩家在大廳。

  1. 在 for 週期中,使用 table.insert() ,使用兩個參數來新增 加至加 activePlayers 陣列和玩家。


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. 要從競技場中取得重生位置,請建立一個名為 spawnLocation 的變數,並將其設置為 第一個 索引在 arenaSpawns 表中。


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Call preparePlayer() 並在 whichPlayerspawnLocation 中輸入。然後, since 該生成位置已使用,請從表中移除 1>它1>。因此,下一個玩家將獲得不同的生成位置。


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. 在玩家被發送到競技場的本地服務器上測試。玩家將繼續在同一個位置重生,因為尚未有人將代碼發送回大廳。

排障提示

在這個時候,您沒有看到預期的結果,請嘗試以下一項。

  • GetPlayers() 中,確認有 兩個正在關閉的父親,例如 Class.Players.GetPlayers() 在說明中。
  • 檢查模組腳本中的功能呼叫序列。例如, matchManager.prepareGame() 應該呼叫 playerManager.sendPlayersToMatch()

提供玩家武器

當回合開始時,每個玩家在競技場中都將獲得一個武器。

添加工具

玩家武器將會是一種工具。雖然任何工具都可以使用,但我們提供了一個範例的劍來啟動。

  1. 從工具箱中匯入武器,或創建自己 (see Tools )。

  2. 將武器放入 ServerStorage。 如果您正在創建自己的工具,請務必工具的名稱為武器,因為這會在後面的指令碼中使用。

提供工具給玩家

現在工具已存儲,請使用指定的程式碼去通過啟用玩家的陣列並提供每個使用者所需的工具。

  1. 在 PlayerManager 中,為 ServerStorage 中的武器添加變數名為 playerWeapon


    -- 地圖變量
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- 玩家變數
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. preparePlayer() 中,將以下代碼貼入獲得玩家的角色。


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. 創建名為「word」的新變數,並使用 Clone() »功能在ServerStorage 中複製武器。然後將武器親用於玩家的角色。


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    local sword = playerWeapon:Clone()
    sword.Parent = character
    end
  4. 本地服務器上測試 來確認每個玩家在發送到競技場時是否獲得工具。請注意,如果您繼續測試,中場休息將會重新啟動,因此玩家每幾秒會重生。這將在下一個課程中解決。

已完成的指令碼

下面是完成審核您的工作的指令碼。

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
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

MatchManager 指令碼


local MatchManager = {}
-- 服務
local ServerStorage = game:GetService("ServerStorage")
-- 模組指令碼
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager

PlayerManager 模組脚本


local PlayerManager = {}
-- 服務
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- 地圖變量
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- 玩家變數
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- 本地函數
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
end
local function preparePlayer(player, whichSpawn)
player.RespawnLocation = whichSpawn
player:LoadCharacter()
local character = player.Character or player.CharacterAdded:Wait()
local sword = playerWeapon:Clone()
sword.Parent = character
end
-- 模組功能
function PlayerManager.sendPlayersToMatch()
print("Sending players to match")
local arenaSpawns = spawnLocations:GetChildren()
for playerKey, whichPlayer in Players:GetPlayers() do
table.insert(activePlayers, whichPlayer)
local spawnLocation = table.remove(arenaSpawns, 1)
preparePlayer(whichPlayer, spawnLocation)
end
end
--事件
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager