Verwalten von Spielern

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

Mit der Codierung des Spiel-Loops ist es an der Zeit, mit dem Hinzufügen von Funktionen zu beginnen. Während eines übereinstimmenkönnen Spieler kommen und Los. Aufgrund dessen ist es für Aufgaben wie das Senden von Spielern in ein Match und das Verfolgen von aktiven Spielern erforderlich. Um diese Aufgaben zu verwalten, erstellen Sie ein Modul-Skript namens PlayerManager .

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

Das Skript einrichten

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

  1. In ServerStorage > ModuleScripts fügen Sie ein neues Modul-Skript namens PlayerManager hinzu. Dann benennen Sie die Modul-Tabelle neu, um den Skript-Namen zu entsprechen und Kommentare für lokale und Modul-Funktionen hinzuzufügen.


    local PlayerManager = {}
    -- Lokale Funktionen
    -- Modul-Funktionen
    return PlayerManager
  2. Lokale Variablen für gefolgte Profilehinzufügen:

    Dienste:

    • Spieler - Wissen Sie, welche Spieler sich dem Spiel angeschlossen haben oder es verlassen haben.
    • ServerStorage - Lager für Spielerwaffen.

    Kartographische Variablen und Spieler:

    • Lobby-Spawn, Arena-Ordner und Arena-Spawn-Ordner - Wird verwendet, um Spieler an verschiedene Orte zu teleportieren.
    • Ein Array von aktiven Spielern - Behalte die Spieler im Auge, die sich derzeit in einem Spiel befinden.

    local PlayerManager = {}
    -- Dienste
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Karten- Variablen
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Spieler Variables
    local activePlayers = {}
    -- Lokale Funktionen
    -- Modul-Funktionen
    return PlayerManager
  3. Erstellen Sie eine Modulfunktion namens sendPlayersToMatch() mit einem Testprint innerhalb.


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

Spieler in der Lobby spawnen

Derzeit gibt es mehrere Spawn-Standorte, sodass Spieler beim Beitreten des Spiels an einem zufälligen Standort spawnen. Um sicherzustellen, dass Spieler in der Lobby spawnen, ändern Sie die Eigenschaftendes Spieler:inRespawnLocation.

  1. Erstellen Sie eine neue lokale Funktion namens onPlayerJoin() mit einem Parameter von player . In dieser Funktion setzen Sie die Respawn-Position des Spieler:inauf die Lobby-Spawn-Variable früher.


    -- Lokale Funktionen
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Fügen Sie einen Events-Bereich unter der Funktion Ihres Moduls hinzu. Dann verbinden Sie onPlayerJoin() mit dem Ereignis PlayerAdded des Playerserivors.


    -- Modul-Funktionen
    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 senden kann.

  1. Gehen Sie zurück zu MatchManager und erstellen Sie Variablen für das gefolgte Profile:

    • ServerStorage-Dienst * ModuleScripts Ordner, Kind von ServerStorage.
    • PlayerManager Skript, das. PL: die Skripts, Kind von ModulScripts.

    local MatchManager = {}
    -- Dienste
    local ServerStorage = game:GetService("ServerStorage")
    -- Modul-Scripts
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Verwenden Sie einen lokalen Server mit mindestens der minimale Spieler, um zu testen. Stellen Sie sicher, dass Sie das gefolgte Profilesehen können:

    • Alle Spieler spawnen in der Lobby.
    • Das druck statement von playerManager erscheint im ausgabefenster.
  3. Sobald Sie fertig sind, klicken Sie auf Cleanup, um den Server herunterzufahren.

Troubleshooting-Tipps

An dieser Stelle funktionieren einige Teile des Skripts nicht wie erwartet, versuche es mit einem der folgenden Optionen.

  • Überprüfen Sie den Namen von Teilen wie der Arena oder der Position von Lobby > StartSpawn, besonders wenn Sie sie anders als in der Lektion benannt haben.
  • Stellen Sie sicher, dass Module in jedem Skript mit der require() Funktion erforderlich sind und richtig geschrieben sind.

Spieler in die Arena senden

Jetzt, da Spieler in der Lobby spawnen, teleportiere sie in ein Match, sobald die Pause beendet ist. Ändere den Spieler:in's RespawnLocation in ein Spawn-Ort in der Arena mit einer Funktion im Player-Objekt namens ReloadCharacter() .

  1. Gehen Sie zum PlayerManager Skript, das. PL: die Skripts, unten onPlayerJoin() , fügen Sie eine neue lokale Funktion hinzu, die preparePlayer() genannt ist. Beinhalten Sie zwei Argumente: 1> Spieler:in1> und 4> whichSpawn4>, die Spawn-Ort senden, um sie zu.


    local activePlayers = {}
    -- Lokale Funktionen
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Modul-Funktionen
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Setzen Sie die Respawn-Position des Spieler:inauf whichSpawn.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Erzwingen Sie den Charakter, sich neu zu laden, verwenden Sie LoadCharacter() , und der Spieler wird respawnen, indem er an seine neu zugewiesene Position zurückkehrt.


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

Spieler zum Spawnen senden

Stellen Sie sicher, dass jedem Spieler eine andere Spawn-Ort in der Arena teleportiert wird, indem Sie einen for Loop verwenden, um durch die aktiven Arrayzu wiederholen. Wenn Sie einen for Loop verwenden, können Sie jeden Wert in der Arraydurchgehen, so dass das Skript sich an eine Vielzahl von Spieler anpassen kann.

  1. In der sendPlayersToMatch() Funktion verwenden Sie eine Variable, um ein Array von allen Arena-Spawn-Standorten zu erstellen, indem Sie die Kinder der Arena > SpawnLocations-Ordner erhalten.


    --Modul-Funktionen
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Fügen Sie den for Loop unten hinzu, um eine Matrix aller Spieler zu erhalten, und dann durch jeden von ihnen zu wiederholen. Um Spieler zu erhalten, geben Sie eingeben: Players:GetPlayers() .


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

Verfolgung und Spawnen

Wenn das Spiel läuft, muss es identifizieren, welche Benutzer spielen, damit sie in der Arena gespawnt werden können. Am Beginn einer Runde wird jedes Spieler in einer Reihe von aktiven Spielern verfolgt. Diese Reihe wird für verschiedene Funktionen verwendet, z. B. Teleportieren oder Weapons zuweisen, um sicherzustellen, dass die Spieler immer noch in der Lobby während einer Runde nicht betroffen sind.

  1. In der for-Schleife verwenden Sie table.insert(), verwendendo die beiden Argumente für die activePlayers -Matrix und den Spieler, der hinzufügenwerden soll.


    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, erstellen Sie eine Variable namens spawnLocation und setzen Sie sie auf den ersten Index in der arenaSpawns-Tabelle.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Rufen Sie preparePlayer() und übergeben Sie in whichPlayer und spawnLocation. Dann, da der nächste Spieler diesen Spawn-Ort verwendet, entfernen Sie 1>entfernen1> es aus der Tabelle, damit der nächste Spieler einen anderen Spawn-Ort erhält.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Testen Sie auf einem lokalen Server, auf den Spieler in die Arena geschickt werden. Die Spieler werden weiterhin in derselben Position respawnen, da der Code, der sie zurück in die Lobby sendet, noch nicht in Ortist.

Troubleshooting-Tipps

An dieser Stelle konntest du die beabsichtigten Ergebnisse nicht sehen, versuche es mit einem der folgenden Optionen.

  • In GetPlayers() , stellen Sie sicher, dass es zwei schließende Elternteile gibt, wie z. B. Class.Players.GetPlayers() in der Anweisung.
  • Überprüfen Sie die Reihe von Funktionsaufrufen in den Modul-Skripts. Zum Beispiel sollte matchManager.prepareGame()``playerManager.sendPlayersToMatch() aufrufen.

Spielern Waffen geben

Wenn eine Runde beginnt, wird jedem Spieler in der Arena eine Waffe zur Verfügung gestellt, die er verwenden kann.

Ein Werkzeug hinzufügen

Spielerwaffen werden ein Toolsein. Während jedes Werkzeug in Roblox verwendet werden kann, haben wir ein Beispielschwert bereitgestellt, um zu starten.

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

  2. Legen Sie die Waffe in ServerStorage. Wenn Sie Ihr eigenes Toolerstellen, stellen Sie sicher, dass das Werkzeug Weapon heißt, da es in späteren Skripts verwendet wird.

Geben von Werkzeugen an Spieler

Jetzt, da das Werkzeug in der Lagerung ist, arbeite an einem Skript, um die aktive Spieler阵列 zu durchlaufen und jedem Benutzer dieses Toolzu liefern.

  1. In PlayerManager fügen Sie eine Variable namens playerWeapon für die Waffe in ServerStorage hinzu.


    -- Karten- Variablen
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Spieler Variables
    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. Erstellen Sie eine neue Variable namens Schwert und verwenden Sie die Clone() Funktion, um eine Kopie der Waffe in ServerStorage zu erstellen. Dann übergeben Sie 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. Testen Sie auf einem lokalen Server , um zu bestätigen, dass jeder Spieler ein Werkzeug erhält, wenn er in die Arena gesendet wird. Denken Sie daran, wenn Sie weiterhin testen, wird die Pause neu gestartet und so spieler alle paar Sekunden respawnen. Dies wird in der nächsten Lektion gelöst.

Abgeschlossene Skripte

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

GameManager-Skript


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


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

PlayerManager-Modul-Skript


local PlayerManager = {}
-- Dienste
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Karten- Variablen
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Spieler Variables
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
-- Modul-Funktionen
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