Avec le game loop codé, il est temps d'ajouter des fonctionnalités à celui-ci. Lors d'un correspondre, les joueurs peuvent venir et aller. En raison de cela, le code est nécessaire pour les tâches comme envoyer des joueurs dans un match et garder une trace des joueurs actifs. Pour gérer ces tâches, créez un script de module nommé PlayerManager .
Ce script lancera une fonction pour envoyer les joueurs dans l'arène avec une arme et sera étendu plus tard dans la série.
Configurer le script
Comme le gestionnaire des joueurs inclut des fonctions utilisées par d'autres scripts, il s'agira d'un script de module.
Dans ServerStorage > ModuleScripts, ajoutez un nouveau script de module nommé PlayerManager. Puis, renommez la table de module pour correspondre au nom du script et ajoutez des commentaires pour les fonctions locales et modulaires.
local PlayerManager = {}-- Fonctions locales-- Fonctions de modulereturn PlayerManagerAjouter des variables locales pour les éléments suivre:
Services :
- Joueurs - Savoir si les joueurs ont rejoint ou quitté le jeu.
- ServerStorage - Stockage pour les armes des joueurs.
Variables de carte et de joueur :
- Lobby Spawn, Arena Folder et Arena Spawn Folder - Utilisé pour téléporter les joueurs dans différentes zones.
- Une tableau des joueurs actifs - Garde une trace des joueurs actuellement dans une jeu.
local PlayerManager = {}-- Serviceslocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Variables de cartelocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variables du joueurlocal activePlayers = {}-- Fonctions locales-- Fonctions de modulereturn PlayerManagerCréer une fonction de module nommée sendPlayersToMatch() avec un test de sortie à l'intérieur.
-- Fonctions locales-- Fonctions de modulefunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
Génération de joueurs dans le lobby
En ce moment, il y a plusieurs endroits d'apparition, ce qui signifie que les joueurs apparaissent dans un endroit aléatoire lorsqu'ils rejoignent le jeu. Pour vous assurer que les joueurs apparaissent dans le lobby, modifiez la propriété RespawnLocation du joueur.
Créez une nouvelle fonction locale nommée onPlayerJoin() avec un paramètre de player . Dans cette fonction, définissez le lieu de réapparition du joueur dans la variable d'apparition du lobby précédemment créée.
-- Fonctions localeslocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendAjoutez une section d'événements en dessous de la fonctionnalité de votre module. Puis, connectez onPlayerJoin() à l'événement PlayerAdded du service de joueur.
-- Fonctions de modulefunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- ÉvénementsPlayers.PlayerAdded:Connect(onPlayerJoin)
Connexion et test
Maintenant, les modules peuvent être connectés et testés. Avec le PlayerManager créé, exigez-le afin que le code dans ce script de module puisse ensuite exécuter et envoyer les joueurs dans le lobby.
Retournez à MatchManager et créez des variables pour les éléments suivre:
- le service ServerStorage.
- ModuleScripts dossier, enfant de ServerStorage.
- PlayerManager script de module, enfant de moduleScripts.
local MatchManager = {}-- Serviceslocal ServerStorage = game:GetService("ServerStorage")-- Scripts de modulelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerUtilisez un serveur local avec au moins le minimum de joueurs pour tester. Confirmez que vous pouvez voir les éléments suivre:
- Tous les joueurs apparaissent dans le lobby.
- La déclaration d'impression de PlayerManager apparaît dans la fenêtre d'Output.
Une fois terminé, cliquez sur Nettoyage pour fermer le serveur.
Conseils de débogage
À ce stade, certaines parties du script ne fonctionnent pas comme prévu, essayez l'une des suivantes ci-dessous.
- Vérifiez le nom des parties telles que l'Arène, ou le lieu de Lobby > StartSpawn, surtout si vous les avez nommées différemment que dans le cours.
- Assurez-vous que les modules sont requis dans chaque script en utilisant la fonction require() et correctement orthographiés.
Envoyer des joueurs à l'arène
Maintenant que les joueurs apparaissent dans le lobby, téléportez-les dans un match une fois la récréation terminée. Modifiez le RespawnLocation du joueur à un lieu d'apparition dans l'arène en utilisant une fonction dans l'objet Player appelée ReloadCharacter() .
Allez dans le script PlayerManager , ci-dessous onPlayerJoin(), ajoutez une nouvelle fonction locale nommée preparePlayer(). Incluez deux paramètres : 1> joueur1> et 4> whichSpawn4>, le lieu d'apparition à envoyer.
local activePlayers = {}-- Fonctions localeslocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Fonctions de modulefunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endDéfinir la position de réapparition du joueur à whichSpawn .
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendForcez le personnage à recharger, en utilisant LoadCharacter(), et le joueur réapparaîtra en utilisant leur lieu nouvellement attribué.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
Envoyer les joueurs au point d'apparition
Assurez-vous que chaque joueur est téléporté à un endroit différent dans l'arène en utilisant un boucle for pour itérer à travers le matricedes joueurs actifs. En utilisant un boucle for, vous pouvez aller à travers chaque valeur dans le matricedes joueurs, ce qui permet au script d'adopter à une variété de joueurs.
Dans la fonction sendPlayersToMatch(), utilisez une variable pour créer un tableau de tous les emplacements d'arène en obtenant les enfants du dossier Arena > SpawnLocations.
--Fonctions de modulefunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endAjoutez le for boucle ci-dessous pour obtenir un tableau de tous les joueurs et puis itérer à travers chacun d'eux. Pour obtenir des joueurs, taper: Players:GetPlayers() .
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() doendend
Suivi et génération
Lorsque le jeu s'exécute, il doit identifier les utilisateurs qui jouent afin qu'ils puissent être invoqués dans l'arène. Au début d'une manche, chaque joueur sera suivi dans un tableau d'actifs. Cet tableau sera utilisé pour différentes fonctions, telles que la téléportation ou l'attribution d'armes, afin que les joueurs toujours dans le lobby pendant une manche ne soient pas affectés.
Dans la boucle, utilisez table.insert(), en utilisant les deux paramètres pour l'arrêt activePlayers et le joueur à ajouter.
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)endendPour obtenir un lieu d'apparition à partir de l'arène, créez une variable nommée spawnLocation et définissez-la sur le premier index dans la table arenaSpawns.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endAppnez preparePlayer() et donnez whichPlayer et spawnLocation . Ensuite, depuis que ce lieu d'apparition a été utilisé, 1> supprimer1> le de la table pour que le prochain joueur obtienne un autre lieu d'apparition.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTestez sur un serveur local que les joueurs sont envoyés dans l'arène. Les joueurs continueront à réapparaître au même endroit car le code pour les envoyer de retour dans le lobby n'est pas encore en emplacement.
Conseils de débogage
À ce stade, vous n'avez pas vu les résultats souhaités, essayez l'un des résultats suivants.
- Dans GetPlayers(), assurez-vous qu'il y a deux fermetures de parenthèses, telles que Class.Players.GetPlayers(|Players:GetPlayers()) dans la déclaration.
- Vérifiez la série de fonctions dans les scripts de module. Par exemple, matchManager.prepareGame() devrait appeler playerManager.sendPlayersToMatch().
Donner aux joueurs des armes
Lorsqu'une manche commence, chaque joueur dans l'arène recevra une arme à utiliser.
Ajout d'un outil
Les armes des joueurs seront un outil. Bien que n'importe quel outil dans Roblox puisse être utilisé, nous avons fourni une épée d'exemple pour commencer.
Importez l'arme de la boîte à outils, ou créez la vôtre (voir Tools).
Placez l'arme dans ServerStorage. Si vous créez votre propre outil, assurez-vous que l'outil s'appelle Arme, car cela sera utilisé dans les scripts ultérieurs.
Donner des outils aux joueurs
Maintenant que l'outil est dans le stockage, travaillez sur un script pour aller dans l'阵êt des joueurs actifs et fournir à chaque utilisateur l'outil.
Dans PlayerManager, ajoutez une variable nommée playerWeapon pour l'Arme dans ServerStorage.
-- Variables de cartelocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variables du joueurlocal activePlayers = {}local playerWeapon = ServerStorage.WeaponDans preparePlayer(), collez le code suivant pour obtenir le personnage du joueur.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endCréez une nouvelle variable nommée épée et utilisez la fonction Clone() pour créer une copie de l'arme dans ServerStorage. Puis, attachez l'épée au personnage du joueur.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendTestez sur un serveur local pour confirmer que chaque joueur reçoit un outil lorsqu'il est envoyé dans l'arène. Gardez à l'esprit que si vous continuez à tester, l'intermission se redémarrera et les joueurs se rallieront toutes les quelques secondes. Cela sera résolu dans la prochaine leçon.
Scripts terminés
Ceux-ci sont des scripts terminés pour vérifier vos travaux.
Script de GameManager
-- Serviceslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de modulelocal 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
Script de MatchManager
local MatchManager = {}
-- Services
local ServerStorage = game:GetService("ServerStorage")
-- Scripts de module
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager
Script de module PlayerManager
local PlayerManager = {}
-- Services
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Variables de carte
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Variables du joueur
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Fonctions locales
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
-- Fonctions de module
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
--événements
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager