Gerenciar jogadores

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Com o ciclo de jogo codificado, é hora de começar a adicionar recursos nele.Durante uma conferir, os jogadores podem ir e vir.Devido a isso, é necessário código para tarefas como enviar jogadores para uma partida e acompanhar jogadores ativos.Para gerenciar essas tarefas, crie um script de módulo chamado Gerenciador de Jogador .

Este script iniciará uma função para enviar os jogadores para a arena com uma arma e será expandido mais tarde na série.

Configure o script

Como o gerenciador de jogadores inclui funções usadas por outros scripts, será um script de módulo.

  1. No Armazenamento do Servidor > ModuleScripts, adicione um novo script de módulo chamado PlayerManager.Então, renomeie a tabela de módulo para combinar com o nome do script e adicione comentários para funções locais e de módulo.


    local PlayerManager = {}
    -- Funções Locais
    -- Funções de Módulo
    return PlayerManager
  2. Adicione variáveis locais para o seguindo:

    Serviços:

    • Jogadores - Saiba quais jogadores se juntaram ou deixaram o jogo.
    • Armazenamento do Servidor - Armazenamento para armas do jogador.

    Variáveis de Mapa e Jogador:

    • Painel de Spawn, Arquivo da Arena e Arquivo do Spawn da Arena - Usado para teletransportar jogadores para diferentes áreas.
    • Uma matriz de jogadores ativos - Acompanha os jogadores atualmente em um jogo.

    local PlayerManager = {}
    -- Serviços
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Variáveis de Mapa
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Variáveis do Jogador
    local activePlayers = {}
    -- Funções Locais
    -- Funções de Módulo
    return PlayerManager
  3. Crie uma função de módulo chamada sendPlayersToMatch() com uma impressão de teste dentro.


    -- Funções Locais
    -- Funções de Módulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

Gerar jogadores no lobby

No momento, existem vários locais de spawn, o que significa que os jogadores aparecem em um aleatório ao se juntar ao jogo.Para garantir que os jogadores apareçam no lobby, altere a propriedade RespawnLocation do jogador.

  1. Crie uma nova função local chamada com um parâmetro de .Nessa função, defina a localização de respawn do jogador para a variável de spawn do lobby feita anteriormente.


    -- Funções Locais
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Adicione uma seção de eventos abaixo da função do módulo. Então, conecte onPlayerJoin() ao evento PlayerAdded do Serviço do Jogador.


    -- Funções de Módulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Eventos
    Players.PlayerAdded:Connect(onPlayerJoin)

Conectar e testar

Agora os módulos podem ser conectados e testados.Com o Gerenciador de Jogadores criado, exija-o para que o código nesse script de módulo possa então ser executado e enviar jogadores para o lobby.

  1. Volte para Gerenciador de Partida e crie variáveis para o seguindo:

    • Serviço Armazenamento de Servidor .
    • ModuleScripts pasta, filho de Armazenamento de Servidor.
    • Script do módulo Gerenciador de Jogadores , filho de scripts de módulo.

    local MatchManager = {}
    -- Serviços
    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. Use um servidor local com pelo menos os jogadores mínimos para testar. Confirme que você pode ver o seguindo:

    • Todos os jogadores aparecem no Lobby.
    • A declaração de impressão do PlayerManager aparece na janela de Saída.
  3. Uma vez terminado, clique em Limpar para desligar o servidor.

Dicas de solução de problemas

Neste ponto, partes do script não estão funcionando como pretendido, tente uma das seguintes abaixo.

  • Verifique o nome das peças, como a Arena, ou o local do Lobby > StartSpawn, especialmente se você as nomeou de forma diferente da instruída na lição.
  • Certifique-se de que os módulos são necessários em cada script usando a função require() e estão corretamente escritos.

Envie jogadores para a arena

Agora que os jogadores aparecem no lobby, teletransporte-os para uma partida quando a intermissão terminar.Altere o RespawnLocation do jogador para um local de spawn na arena usando uma função no objeto Jogador chamada ReloadCharacter().

  1. Vá para o script Gerenciador de Jogadores, abaixo >, adicione uma nova função local chamada .Inclua dois parâmetros: player e whichSpawn, o local de spawn para enviá-los.


    local activePlayers = {}
    -- Funções Locais
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Funções de Módulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Defina a localização de respawn do jogador em whichSpawn.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Force o personagem a recarregar, usando LoadCharacter(), e o jogador respawnará usando sua nova localização atribuída.


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

Envie jogadores para Gerar

Certifique-se de que cada jogador seja teletransportado para um local de spawn diferente na arena usando um loop for para iterar através do matriz / listade jogadores ativos.Usar um for permite que você passe por todos os valores no matriz / listade jogadores, permitindo que o script se adapte a uma variedade de números de jogadores.

  1. Na função sendPlayersToMatch(), use uma variável para criar um array de todos os locais de spawn da arena obter os filhos da pasta Arena > SpawnLocations.


    --Funções de Módulo
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Adicione o for ciclo abaixo para obter um array de todos os jogadores e, em seguida, iterar por cada um deles. Para obter jogadores, digitar: Players:GetPlayers().


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

Rastrear e Gerar

Quando o jogo é executado, ele precisa identificar quais usuários estão jogando para que possam ser gerados na arena.No início de uma rodada, cada jogador será rastreado em um conjunto de jogadores ativos.Esse array será usado para diferentes funções, como teletransportar ou atribuir armas, garantindo que os jogadores ainda no lobby durante uma rodada não sejam afetados.

  1. No loop for, use table.insert() , usando os dois parâmetros para o activePlayers array e o jogador para adicionar.


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Para obter um local de spawn da arena, crie uma variável chamada e defina-a para o índice primeiro na tabela .


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Chame preparePlayer() e passe em whichPlayer e spawnLocation.Então, uma vez que a localização de spawn foi usada, remova dela da tabela para que o próximo jogador receba um Gerardiferente.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Teste em um servidor local que os jogadores são enviados para a arena.Os jogadores continuarão a respawnar no mesmo local porque o código para enviá-los de volta ao lobby ainda não está em vigor.

Dicas de solução de problemas

Neste ponto, você não viu os resultados pretendidos, tente um dos seguintes abaixo.

  • Em GetPlayers(), certifique-se de que há duas fechando parênteses, como Class.Players.GetPlayers(|Players:GetPlayers()) na declaração.
  • Verifique a série de chamadas de função nos scripts do módulo. Por exemplo, matchManager.prepareGame() deve chamar playerManager.sendPlayersToMatch() .

Dando aos Jogadores Armas

Quando uma rodada começar, cada jogador na arena receberá uma arma para usar.

Adicione uma ferramenta

As armas do jogador serão uma ferramenta. Embora qualquer ferramenta no Roblox possa ser usada, fornecemos uma espada de amostra para iniciar.

  1. Importe a arma da Caixa de Ferramentas, ou crie a sua própria (veja Tools ).

  2. Coloque a arma no Armazenamento do Servidor. Se você estiver criando sua própria ferramenta, certifique-se de que a ferramenta seja chamada Arma, pois ela será usada em scripts posteriores.

Dê ferramentas aos jogadores

Agora que a ferramenta está no armazenamento, trabalhe em um script para percorrer o conjunto ativo de jogadores e fornecer cada usuário essa ferramenta.

  1. No PlayerManager, adicione uma variável chamada playerWeapon para a Arma no Armazenamento do Servidor.


    -- Variáveis de Mapa
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Variáveis do Jogador
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. Em preparePlayer(), cole o seguinte código para obter o personagem do jogador.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Crie uma nova variável chamada sword e use a função Clone() para criar uma cópia da arma no Armazenamento do Servidor.Então, associar a espada ao personagem do jogador.


    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. Teste em um servidor local para confirmar que cada jogador receba uma ferramenta ao ser enviado para a arena.Tenha em mente, se você continuar testando, a intermissão continuará reiniciando e, assim, os jogadores reaparecerão a cada poucos segundos.Isso será resolvido na próxima lição.

Scripts concluídos

Abaixo estão scripts concluídos para verificar duas vezes o seu trabalho.

scriptdo Gerenciador de Jogo


-- Serviços
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

scriptdo Gerenciador de Partida


local MatchManager = {}
-- Serviços
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

scriptdo módulo Gerenciador de Jogadores


local PlayerManager = {}
-- Serviços
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Variáveis de Mapa
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Variáveis do Jogador
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Funções Locais
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
-- Funções 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