Gérer les joueurs

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

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.

  1. 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 module
    return PlayerManager
  2. Ajouter 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 = {}
    -- 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 = {}
    -- Fonctions locales
    -- Fonctions de module
    return PlayerManager
  3. Créer une fonction de module nommée sendPlayersToMatch() avec un test de sortie à l'intérieur.


    -- Fonctions locales
    -- Fonctions de module
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return 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.

  1. 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 locales
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Ajoutez 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 module
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Événements
    Players.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.

  1. 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 = {}
    -- 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
  2. Utilisez 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.
  3. 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() .

  1. 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 locales
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Fonctions de module
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Définir la position de réapparition du joueur à whichSpawn .


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Forcez 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 = whichSpawn
    player: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.

  1. 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 module
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Ajoutez 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() do
    end
    end

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.

  1. 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() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Pour 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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Appnez 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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Testez 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.

  1. Importez l'arme de la boîte à outils, ou créez la vôtre (voir Tools).

  2. 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.

  1. Dans PlayerManager, ajoutez une variable nommée playerWeapon pour l'Arme dans 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
  2. Dans preparePlayer(), collez le code suivant pour obtenir le personnage du joueur.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Cré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 = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    local sword = playerWeapon:Clone()
    sword.Parent = character
    end
  4. Testez 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


-- Services
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Scripts de module
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

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