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.
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-Funktionenreturn PlayerManagerLokale 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 = {}-- Dienstelocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Karten- Variablenlocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Spieler Variableslocal activePlayers = {}-- Lokale Funktionen-- Modul-Funktionenreturn PlayerManagerErstellen Sie eine Modulfunktion namens sendPlayersToMatch() mit einem Testprint innerhalb.
-- Lokale Funktionen-- Modul-Funktionenfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn 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.
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 Funktionenlocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendFügen Sie einen Events-Bereich unter der Funktion Ihres Moduls hinzu. Dann verbinden Sie onPlayerJoin() mit dem Ereignis PlayerAdded des Playerserivors.
-- Modul-Funktionenfunction 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 senden kann.
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 = {}-- Dienstelocal ServerStorage = game:GetService("ServerStorage")-- Modul-Scriptslocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerVerwenden 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.
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() .
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 Funktionenlocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Modul-Funktionenfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endSetzen Sie die Respawn-Position des Spieler:inauf whichSpawn.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendErzwingen 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 = whichSpawnplayer: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.
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-Funktionenfunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endFü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() doendend
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.
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() dotable.insert(activePlayers, whichPlayer)endendUm 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endRufen 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTesten 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.
Importiere die Waffe aus der Toolbox oder erstelle deine eigene (siehe Tools ).
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.
In PlayerManager fügen Sie eine Variable namens playerWeapon für die Waffe in ServerStorage hinzu.
-- Karten- Variablenlocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Spieler Variableslocal 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()endErstellen 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 = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendTesten 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
-- Dienstelocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Modul-Scriptslocal 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
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