Gestionando 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 características a él. Durante una coincidir, los jugadores pueden venir y ir. Debido a esto, el código se necesita para tareas como enviar jugadores a una partida y mantener un registro de jugadores activos. Para administrar estas tareas, crea un módulo de script llamado PlayerManager .

Este script comenzará una función para enviar jugadores a la arena con un arma y será expandida más tarde en la serie.

Configurando el script

Dado que el gestor de jugadores incluye funciones utilizadas por otros scripts, se tratará de un script de módulo.

  1. En ServerStorage > ModuleScripts, agrega un nuevo módulo de script llamado PlayerManager. Luego, renombrea la tabla del módulo 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. Agregue variables locales para lo siguiendo:

    Servicios:

    • Jugadores - Saber qué jugadores se han unido o salido del juego.
    • ServerStorage - Almacenamiento para armas del jugador.

    Mapa y variables de jugador:

    • Lobby Spawn, Arena Folder y Arena Spawn Folder - Se usa para teletransportar jugadores a diferentes áreas.
    • Un Array de Jugadores Activos - Mantiene un registro de jugadores en un juego actualmente.

    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 un print de prueba dentro.


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

Generando Jugadores en el Lobby

En este momento, hay múltiples ubicaciones de spawn, lo que significa que los jugadores aparecen en una ubicación aleatoria al unirse al juego. Para asegurar que los jugadores aparezcan en el lobby, cambia la propiedad de RespawnLocation del jugador.

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


    -- Funciones locales
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Agregue una sección de eventos debajo de la función de su módulo. Luego, conecte onPlayerJoin() a el evento de servicio de Player Service's PlayerAdded .


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

Conectando y Probando

Ahora los módulos se pueden conectar y probar. Con el PlayerManager creado, requíralo para que el código en ese módulo de script pueda luego ejecutar y enviar jugadores al lobby.

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

    • Servicio de almacenamiento del servidor * ModuleScripts directorio, hijo de ServerStorage.
    • PlayerManager script de módulo, hijo de moduleScripts.

    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 se generan en el Lobby.
    • La declaración de impresión de PlayerManager aparece en la ventana de salida.
  3. Una vez terminado, haga clic en Limpiar para apagar el servidor.

Consejos de solución de problemas

En este punto, partes del script no están funcionando como se esperaba, intenta uno de los siguientes.

  • Asegúrese de revisar el nombre de las partes, como la Arena, o la ubicación de Lobby > StartSpawn, especialmente si los nombró de forma diferente a lo que se indica en la lección.
  • Asegúrese de que se requieran módulos en cada script utilizando la función require() y que estén correctamente escritos.

Enviar Jugadores a la Arena

Ahora que los jugadores aparecen en el lobby, teletransportarlos a una carrera una vez que termine la intermisión. Cambia el jugador's RespawnLocation a una ubicación de spawn en la arena usando una función en el objeto Player llamada ReloadCharacter() .

  1. Ve al script PlayerManager , debajo de onPlayerJoin() , añade una nueva función local llamada preparePlayer() . Ingrese dos parámetros: 1> jugador1> y 4> whichSpawn4>, la ubicación de spawn 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 ubicación asignada recientemente.


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

Enviar jugadores para generar

Asegúrese de que cada jugador se teletransporte a una ubicación de generación diferente en la arena utilizando un ciclo de for para repetir a través del matriz/listade jugadores activos. Usando un ciclo de for permite que se vaya a través de cada valor en el matriz/listade jugadores, permitiendo que el script se adapte a una variedad de números de jugadores.

  1. En la función sendPlayersToMatch(), usa una variable para crear un arreglo de todas las ubicaciones de generación de la arena al obtener los hijos de la carpeta Arena > SpawnLocations.


    --Funciones de módulo
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Agregue el for bucle a continuación para obtener un conjunto de todos los jugadores y luego repetir 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

Rastreo y generación

Cuando se ejecuta el juego, debe identificar a los usuarios que están jugando para que se puedan invocar en la arena. Al comienzo de una ronda, cada jugador será rastreado en un arreglo de jugadores activos. Ese arreglo se usará para diferentes funciones, como teletransportar o asignir armas, asegurando que los jugadores que estén en el lobby durante una ronda no sean afectados.

  1. En la for loop, use table.insert() , utilizando los dos parámetros para el arreglo activePlayers 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 spawn de la arena, crea una variable llamada spawnLocation y establece la en el índice de primer en la tabla arenaSpawns.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Llamar preparePlayer() y pasar en whichPlayer y spawnLocation . Luego, ya que ese lugar de generación fue usado, 1> eliminarlo1> de la tabla para que el próximo jugador obtenga un diferente lugar de generación.


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

Consejos de solución de problemas

En este punto, no viste los resultados esperados, intenta uno de los siguientes.

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

Darle a los jugadores armas

Cuando comience una ronda, cada jugador en la arena recibirá un arma para usar.

Agregar una herramienta

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

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

  2. Coloca el arma en el almacenamiento de servidores. Si estás creando tu propia herramienta, asegúrate de que la herramienta se llame Arma, ya que se usará en los scripts posteriores.

Dar herramientas a los jugadores

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

  1. En PlayerManager, agregue una variable llamada playerWeapon para la Weapon 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(), pegue 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. Cree una nueva variable llamada espada y use la función Clone() para crear una copia de la arma en ServerStorage. Luego, ajuste 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. Pruebe en un servidor local para confirmar que cada jugador obtenga una herramienta cuando se envíe a la arena. Tenga en cuenta, si continúa probando, la interrupción se reiniciará y, por lo tanto, los jugadores reaparecerán cada pocos segundos. Esto se resolverá en la siguiente lección.

Scripts Completados

A continuación, están los scripts completados para revisar tu trabajo.

Script de GameManager


-- 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 de MatchManager


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

Script del 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
--事件
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager