Spieler verwalten

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Mit der im Spiel-Loop kodierten Schleife ist es an der Zeit, Features hinzuzufügen.Während eines übereinstimmenkönnen Spieler kommen und Los.Aus diesem Grund wird Code für Aufgaben wie das Senden von Spielern in ein Spiel und das Verfolgen aktiver Spieler benötigt.Um diese Aufgaben zu verwalten, erstelle ein Modulskript mit dem Namen PlayerManager .

Dieses Skript wird eine Funktion starten, die Spieler in die Arena mit einer Waffe schickt und später in der Serie erweitert wird.

Konfiguriere das Skript, das. PL: die Skripts

Da der Spielermanager Funktionen enthält, die von anderen Skripten verwendet werden, wird es ein Skript, das. PL: die Skriptssein.

  1. In ServerStorage > ModuleScripts füge ein neues Modulskript namens PlayerManager hinzu.Dann benenne den Modul-Tab um, um den Skriptnamen zu entsprechen, und füge Kommentare für lokale und Modulfunktionen hinzu.


    local PlayerManager = {}
    -- Lokale Funktionen
    -- Modulfunktionen
    return PlayerManager
  2. Füge lokale Variablen für das gefolgte Profilehinzu:

    Dienste:

    • Spieler - Erfahre, welche Spieler dem Spiel beigetreten oder es verlassen sind.
    • ServerStorage - Speicher für Spielerwaffen.

    Karte und Spielervariablen:

    • Lobby-Spawn, Arena-Ordner und Arena-Spawn-Ordner - Wird verwendet, um Spieler in verschiedene Bereiche zu teleportieren.
    • Ein Array von aktiven Spielern - Verfolgt Spieler, die derzeit in einem Spiel sind.

    local PlayerManager = {}
    -- Dienste
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Kartenvariablen
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Spielervariablen
    local activePlayers = {}
    -- Lokale Funktionen
    -- Modulfunktionen
    return PlayerManager
  3. Erstellen Sie eine Modulfunktion namens sendPlayersToMatch() mit einem Testdruck im Inneren.


    -- Lokale Funktionen
    -- Modulfunktionen
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

Spieler in der Lobby spawnen

Im Moment gibt es mehrere Spawn-Orte, was bedeutet, dass Spieler bei der Anmeldung an einem zufälligen Spawn spawnen.Um sicherzustellen, dass Spieler in der Lobby spawnen, ändere die Eigenschaftendes Spieler:inRespawnLocation.

  1. Erstellen Sie eine neue lokale Funktion namens onPlayerJoin() mit einem Parameter von player.In dieser Funktion legen Sie den Wiederbelebungsstandort des Spieler:inauf die Lobby-Spawn-Variable fest, die zuvor erstellt wurde.


    -- Lokale Funktionen
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Füge einen Abschnitt für Ereignisse unter deiner Modulfunktion hinzu. Verbinde dann onPlayerJoin() mit dem Ereignis des Player-Services PlayerAdded.


    -- Modulfunktionen
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Ereignisse
    Players.PlayerAdded:Connect(onPlayerJoin)

Verbinden und testen

Jetzt können die Module verbunden und getestet werden.Mit dem PlayerManager erstellt, benötigen Sie es, damit der Code in diesem Modulskript dann ausgeführt und Spieler in die Lobby geschickt werden können.

  1. Gehe zurück zu MatchManager und erstelle Variablen für gefolgte Profile:

    • ServerStorage Dienst.
    • ModuleScripts Ordner, Kind von ServerStorage.
    • SpielerManager Skript, das. PL: die Skripts, Kind von Modulskripts.

    local MatchManager = {}
    -- Dienste
    local ServerStorage = game:GetService("ServerStorage")
    -- Modul-Skripte
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Verwende einen lokalen Server mit mindestens den folgenden Spielern zum Testen. Bestätige, dass du gefolgte Profilesehen kannst:

    • Alle Spieler spawnen in der Lobby.
    • Die Druckausgabe von PlayerManager erscheint im Ausgabe-Fenster.
  3. Sobald Sie fertig sind, klicken Sie auf Aufräumen, um den Server herunterzufahren.

Problemlösungstipps

An diesem Punkt funktionieren Teile des Skripts nicht wie beabsichtigt, versuche eines der folgenden Optionen.

  • Überprüfe den Namen von Teilen wie der Arena oder dem Standort von Lobby > StartSpawn, insbesondere, wenn du sie anders benannt hast als in der Lektion angegeben.
  • Stellen Sie sicher, dass Module in jedem Skript benötigt werden, indem die require()-Funktion verwendet wird und richtig geschrieben werden.

Schicke Spieler in die Arena

Jetzt, da Spieler in der Lobby spawnen, teleportiere sie in ein Spiel, sobald die Pause vorbei ist.Ändere das RespawnLocation des Spieler:inin einen Spawn-Ort in der Arena mit einer Funktion im Spieler-Objekt namens ReloadCharacter().

  1. Gehen Sie zum Skript, das. PL: die Skripts, unten onPlayerJoin(), fügen Sie eine neue lokale Funktion mit dem Namen preparePlayer() hinzu.Füge zwei Parameter ein: player und whichSpawn, den Spawn-Standort, an den sie gesendet werden sollen.


    local activePlayers = {}
    -- Lokale Funktionen
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Modulfunktionen
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Setze den Respawn-Standort des Spieler:inauf whichSpawn.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Zwringe den Charakter zur Neuladung, indem du LoadCharacter() verwendest, und der Spieler wird mit seinem neu zugewiesenen Standort respawnen.


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

Spieler zum Spawn senden

Stelle sicher, dass jeder Spieler in eine andere Spawn-Location der Arena teleportiert wird, indem ein for -Schleife verwendet wird, um die aktiven Arraydurchzugehen.Die Verwendung einer for -Schleife ermöglicht es Ihnen, jeden Wert in der Arraydurchzugehen, so dass das Skript sich an eine Vielzahl von Spielerzahlen anpassen kann.

  1. Verwende in der sendPlayersToMatch()-Funktion eine Variable, um eine Array aller Spawnstandorte der Arena zu erstellen, indem du die Kinder des Ordners Arena > SpawnLocations erhältst.


    --Modulfunktionen
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Füge die for -Schleife unten hinzu, um eine Liste aller Spieler zu erhalten und dann durch jeden von ihnen zu iterieren. Um Spieler zu erhalten, gib eingeben: Players:GetPlayers() .


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

Verfolgen und Spawn

Wenn das Spiel ausgeführt wird, muss es identifizieren, welche Benutzer spielen, damit sie in der Arena gespawnt werden können.Am Beginn einer Runde wird jeder Spieler in einer Reihe aktiver Spieler verfolgt.Dieses Array wird für verschiedene Funktionen verwendet, wie Teleportieren oder Zuweisen von Waffen, um sicherzustellen, dass Spieler, die während einer Runde noch in der Lobby sind, nicht beeinträchtigt werden.

  1. Im for-Loop verwende table.insert(), indem du die beiden Parameter für das activePlayers-Array und den Spieler zum hinzufügenverwendest.


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Um einen Spawn-Standort aus der Arena zu erhalten, erstelle eine Variable mit dem Namen spawnLocation und lege sie auf den ersten Index in der arenaSpawns.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Rufen Sie preparePlayer() und geben Sie whichPlayer und spawnLocation ein.Dann, da dieser Spawn-Ort verwendet wurde, entferne ihn aus der Tabelle, damit der nächste Spieler einen anderen Spawn bekommt.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Teste auf einem lokalen Server, auf den Spieler in die Arena geschickt werden.Die Spieler werden weiterhin am selben Ort respawnen, weil der Code, sie zurück in die Lobby zu schicken, noch nicht vorhanden ist.

Problemlösungstipps

An diesem Punkt sahst du die beabsichtigten Ergebnisse nicht, versuche eines der folgenden Optionen.

  • In GetPlayers() stellen Sie sicher, dass es zwei Schließungszeichen wie Class.Players.GetPlayers(|Players:GetPlayers()) in der Aussage gibt.
  • Überprüfen Sie die Reihe von Funktionsaufrufen in den Modulskripts. Zum Beispiel sollte matchManager.prepareGame() aufrufen playerManager.sendPlayersToMatch().

Spielern Waffen geben

Wenn eine Runde beginnt, erhält jeder Spieler in der Arena eine Waffe zum Verwenden.

Füge ein Toolhinzu

Spielerwaffen werden ein Toolsein. Während jedes Werkzeug in Roblox verwendet werden kann, haben wir ein Beispielschwert zur startenbereitgestellt.

  1. Importiere die Waffe aus der Toolbox oder erstelle deine eigene (siehe Tools ).

  2. Platziere die Waffe in ServerStorage. Wenn du dein eigenes Toolerstellst, stelle sicher, dass das Werkzeug Weapon heißt, da es in späteren Skripts verwendet wird.

Tools an Spieler übergeben

Jetzt, da das Tool im Speicher ist, arbeite an einem Skript, um durch das aktive Spielerarray zu gehen und jedem Benutzer dieses Werkzeug bereitzustellen.

  1. Füge im PlayerManager eine Variable mit dem Namen playerWeapon für die Waffe im ServerStorage hinzu.


    -- Kartenvariablen
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Spielervariablen
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. In preparePlayer() fügen Sie den folgenden Code ein, um den Charakter des Spieler:inzu erhalten.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Erstelle eine neue Variable mit dem Namen Schwert und verwende die Clone()-Funktion, um eine Kopie der Waffe im ServerStorage zu erstellen.Dann überlass das Schwert dem Charakter des Spieler:in.


    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. Teste auf einem lokalen Server , um zu bestätigen, dass jeder Spieler ein Werkzeug erhält, wenn er in die Arena geschickt wird.Denke daran, wenn du die Tests fortsetzt, wird die Pause immer wieder neu gestartet, und so werden Spieler alle paar Sekunden respawnen.Dies wird in der nächsten Lektion gelöst werden.

Abgeschlossene Skripte

Im Folgenden sind abgeschlossene Skripte, um deine Arbeit zu überprüfen.

Skript, das. PL: die Skripts


-- Dienste
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Modul-Skripte
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

Skript, das. PL: die Skripts


local MatchManager = {}
-- Dienste
local ServerStorage = game:GetService("ServerStorage")
-- Modul-Skripte
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager

Skript, das. PL: die Skripts


local PlayerManager = {}
-- Dienste
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Kartenvariablen
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Spielervariablen
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Lokale Funktionen
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
-- Modulfunktionen
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
--ereignisse
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager