Administrar jugadores

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Con el ciclo de juego codificado, es hora de comenzar a agregar funciones en él.Durante una coincidir, los jugadores pueden ir y venir.Debido a esto, se necesita código para tareas como enviar a los jugadores a una partida y mantener un registro de jugadores activos.Para administrar estas tareas, crea un guión de módulo llamado PlayerManager .

Este script iniciará una función para enviar jugadores a la arena con una arma y se expandirá más tarde en la serie.

Configurar el script

Debido a que el administrador de jugadores incluye funciones utilizadas por otros scripts, será un script de módulo.

  1. En ServerStorage > ModuleScripts, agregue un nuevo script de módulo llamado PlayerManager.Luego, renombra la tabla de módulos para que coincida con el nombre del script y agrega comentarios para las funciones locales y de módulo.


    local PlayerManager = {}
    -- Funciones locales
    -- Funciones de módulo
    return PlayerManager
  2. Añade variables locales para lo siguiendo:

    Servicios:

    • Jugadores - Saber qué jugadores se han unido o han abandonado el juego.
    • Almacenamiento del servidor - Almacenamiento para armas de jugadores.

    Variables de mapa y jugador:

    • Generador de vestíbulo, carpeta de arena y carpeta de aparición de arena - Se usa para teletransportar a los jugadores a diferentes áreas.
    • Un array de jugadores activos - Rastrea a los jugadores actualmente en un juego.

    local PlayerManager = {}
    -- Servicios
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Variables de mapa
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Variables del jugador
    local activePlayers = {}
    -- Funciones locales
    -- Funciones de módulo
    return PlayerManager
  3. Crea una función de módulo llamada sendPlayersToMatch() con una impresión de prueba dentro.


    -- Funciones locales
    -- Funciones de módulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

Genera jugadores en el vestíbulo

En este momento, hay múltiples ubicaciones de generación, lo que significa que los jugadores aparecen en una aleatoria al unirse al juego.Para asegurarse de que los jugadores aparezcan en el vestíbulo, cambie la propiedad RespawnLocation del jugador.

  1. Crea una nueva función local llamada onPlayerJoin() con un parámetro de player .En esa función, establece la ubicación de reaparición del jugador en la variable de generación del lobby creada anteriormente.


    -- Funciones locales
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Añade una sección de eventos debajo de la función de tu módulo. Luego, conecta onPlayerJoin() al evento de PlayerAdded del Servicio del Jugador.


    -- Funciones de módulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Eventos
    Players.PlayerAdded:Connect(onPlayerJoin)

Conectar y probar

Ahora los módulos se pueden conectar y probar.Con el PlayerManager creado, requiere que se ejecute para que el código en ese script de módulo pueda luego enviar jugadores al vestíbulo.

  1. Vuelva a MatchManager y cree variables para lo siguiendo:

    • Servicio de almacenamiento del servidor .
    • Archivo de carpetas ModuleScripts hijo de ServerStorage.
    • Guion del módulo PlayerManager , hijo de los scriptde módulo.

    local MatchManager = {}
    -- Servicios
    local ServerStorage = game:GetService("ServerStorage")
    -- Scripts de módulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Usa un servidor local con al menos los jugadores mínimos para probar. Confirma que puedes ver lo siguiendo:

    • Todos los jugadores aparecen en el vestíbulo.
    • La declaración de impresión de PlayerManager aparece en la ventana de salida.
  3. Una vez terminado, haga clic en Limpieza para cerrar el servidor.

Consejos de solución de problemas

En este punto, partes del script no funcionan como se pretendía, prueba una de las siguientes opciones.

  • Compruebe el nombre de las partes como la Arena, o la ubicación de Lobby > StartSpawn, especialmente si las nombró de manera diferente a la indicada en la lección.
  • Asegúrate de que los módulos sean requeridos en cada script usando la función require() y que estén escritos correctamente.

Enviar jugadores a la arena

Ahora que los jugadores aparecen en el vestíbulo, teletransportarlos a una partida una vez que la intermisión termine.Cambia el RespawnLocation del jugador a una ubicación de generación en la arena usando una función en el objeto Jugador llamada ReloadCharacter() .

  1. Ve al script Manager de jugadores , debajo de onPlayerJoin(), agrega una nueva función local llamada preparePlayer().Incluye dos parámetros: player y whichSpawn, la ubicación de generación para enviarlos.


    local activePlayers = {}
    -- Funciones locales
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Funciones de módulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Establece la ubicación de reaparición del jugador en whichSpawn.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Obliga al personaje a recargar, usando LoadCharacter() , y el jugador reaparecerá usando su nuevo lugar asignado.


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

Enviar jugadores al regeneración

Asegúrate de que cada jugador se teletransporte a una ubicación de generación diferente en la arena usando un bucle for para iterar por el matriz/listade jugadores activos.El uso de un bucle for permite que pases por todos los valores en el matriz/listade jugadores, lo que permite al script adaptarse a una variedad de números de jugadores.

  1. En la función sendPlayersToMatch(), utilice una variable para crear un array de todos los lugares de generación de arena al obtener los hijos de la carpeta Arena > SpawnLocations.


    --Funciones de módulo
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Añade el bucle for a continuación para obtener un array de todos los jugadores y luego iterar a través de cada uno de ellos. Para obtener jugadores, introducir: Players:GetPlayers() .


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

Seguir y generar

Cuando se ejecuta el juego, debe identificar a qué usuarios están jugando para que puedan ser generados en la arena.Al comienzo de una ronda, cada jugador se rastreará en un conjunto de jugadores activos.Ese array se usará para diferentes funciones, como teletransportarse o asignar armas, asegurando que los jugadores que aún están en el vestíbulo durante una ronda no se vean afectados.

  1. En el bucle for, utilice table.insert() , utilizando los dos parámetros para el activePlayers array y el jugador para añadir.


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Para obtener una ubicación de generación de la arena, crea una variable llamada y ponla en el índice primero en la tabla >.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Llama a preparePlayer() y pasa whichPlayer y spawnLocation.Entonces, ya que se utilizó esa ubicación de generación, elimina de la tabla para que el próximo jugador obtenga un punto de generación diferente.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Prueba en un servidor local que los jugadores son enviados a la arena .Los jugadores seguirán reapareciendo en la misma ubicación porque el código para enviarlos de vuelta al vestíbulo aún no está en lugar.

Consejos de solución de problemas

En este punto, no viste los resultados pretendidos, prueba uno de los siguientes a continuación.

  • En GetPlayers() , asegúrate de que haya dos cerrando paréntesis, como Class.Players.GetPlayers(|Players:GetPlayers()) en la declaración.
  • Compruebe la serie de llamadas de función en los scripts del módulo. Por ejemplo, matchManager.prepareGame() debería llamar playerManager.sendPlayersToMatch() .

Dar armas a los jugadores

Cuando comience una ronda, a cada jugador en la arena se le proporcionará una arma para usar.

Añadir una herramienta

Las armas del jugador serán una herramienta. Aunque cualquier herramienta en Roblox se puede usar, hemos proporcionado una espada de muestra para iniciar.

  1. Importa el arma de la caja de herramientas, o crea la tuya propia (ver Tools ).

  2. Coloca la arma en el almacén del servidor. Si estás creando tu propia herramienta, asegúrate de que la herramienta se llame Arma, ya que se usará en scripts posteriores.

Dar herramientas a los jugadores

Ahora que la herramienta está en almacenamiento, trabaja en un script para recorrer el conjunto de jugadores activos y proporcionar cada herramienta a cada usuario.

  1. En PlayerManager, agrega una variable llamada playerWeapon para el arma en ServerStorage.


    -- Variables de mapa
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Variables del jugador
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. En preparePlayer() , pega el siguiente código para obtener el personaje del jugador.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Crea una nueva variable llamada espada y usa la función Clone() para crear una copia de la arma en el almacén de servidores.Luego, asigna la espada al personaje del jugador.


    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. Prueba en un servidor local para confirmar que cada jugador recibe una herramienta cuando se envía a la arena .Tenga en cuenta, si continúa probando, la interrupción seguirá reiniciándose y los jugadores reaparecerán cada pocos segundos.Esto se resolverá en la siguiente lección.

Guiones completados

A continuación, se completan los scripts para verificar doblemente tu trabajo.

scriptdel administrador del juego


-- Servicios
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Scripts de módulo
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

Guión scriptMatchManager


local MatchManager = {}
-- Servicios
local ServerStorage = game:GetService("ServerStorage")
-- Scripts de módulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager

scriptdel módulo PlayerManager


local PlayerManager = {}
-- Servicios
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Variables de mapa
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Variables del jugador
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Funciones 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
-- Funciones de módulo
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
--eventos
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager