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.
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-- Modulfunktionenreturn PlayerManagerFü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 = {}-- Dienstelocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Kartenvariablenlocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Spielervariablenlocal activePlayers = {}-- Lokale Funktionen-- Modulfunktionenreturn PlayerManagerErstellen Sie eine Modulfunktion namens sendPlayersToMatch() mit einem Testdruck im Inneren.
-- Lokale Funktionen-- Modulfunktionenfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn 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.
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 Funktionenlocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendFüge einen Abschnitt für Ereignisse unter deiner Modulfunktion hinzu. Verbinde dann onPlayerJoin() mit dem Ereignis des Player-Services PlayerAdded.
-- Modulfunktionenfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- EreignissePlayers.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.
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 = {}-- Dienstelocal ServerStorage = game:GetService("ServerStorage")-- Modul-Skriptelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerVerwende 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.
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().
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 Funktionenlocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Modulfunktionenfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endSetze den Respawn-Standort des Spieler:inauf whichSpawn.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendZwringe 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 = whichSpawnplayer: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.
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.
--Modulfunktionenfunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endFü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() doendend
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.
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() dotable.insert(activePlayers, whichPlayer)endendUm 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endRufen 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTeste 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.
Importiere die Waffe aus der Toolbox oder erstelle deine eigene (siehe Tools ).
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.
Füge im PlayerManager eine Variable mit dem Namen playerWeapon für die Waffe im ServerStorage hinzu.
-- Kartenvariablenlocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Spielervariablenlocal activePlayers = {}local playerWeapon = ServerStorage.WeaponIn preparePlayer() fügen Sie den folgenden Code ein, um den Charakter des Spieler:inzu erhalten.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endErstelle 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 = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendTeste 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
-- Dienstelocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Modul-Skriptelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("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