Gerenciando Jogadores

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

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

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

Configurando o Script

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

  1. In ServerStorage >ModuleScripts, adicione um novo script de módulo chamado PlayerManager. Em seguida, renomeie a tabela de módulo para corresponder ao nome do script e adicione comentários para funções locais e de módulo.


    local PlayerManager = {}
    -- Funções Locais
    -- Funções de Modulo
    return PlayerManager
  2. Adicionar variáveis locais para o seguindo:

    Serviços:

    • Jogadores - Saiba se os jogadores se juntaram ou saíram do jogo.
    • Armazenamento do Servidor - Armazenamento para armas do jogador.

    Variáveis de Mapa e Jogador:

    • Lobby Spawn, Arena Folder e Arena Spawn Folder - Usado para teletransportar jogadores para diferentes áreas.
    • Um Array de Jogadores Ativos - Mantém rastreamento de 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 Modulo
    return PlayerManager
  3. Crie uma função de módulo chamada sendPlayersToMatch() com um print de teste dentro.


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

Gerando Jogadores no Lobby

No momento, há vários locais de spawn, o que significa que os jogadores spawnam em um aleatório quando se juntar ao jogo. Para garantir que os jogadores spawnem no lobby, altere a propriedade de RespawnLocation do jogador.

  1. Crie uma nova função local chamada onPlayerJoin() com um parâmetro de player . Nesta função, configure a localização de ressurgimento 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 sua função de módulo. Em seguida, conecte onPlayerJoin() ao evento de serviço de PlayerService's PlayerAdded.


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

Conectando e Testando

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

  1. Volte para MatchManager e crie variáveis para o seguindo:

    • Serviço de armazenamento do servidor .
    • ModuleScripts pasta, filho de ServerStorage.
    • PlayerManager módulo de script de script, filho de móduloScripts.

    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 são gerados no Lobby.
    • A declaração de impressão do PlayerManager aparece na janela de saída.
  3. Quando terminar, clique em Limpar para encerrar o servidor.

Dicas de solução de problemas

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

  • Verifique o nome de peças, como a Arena, ou a localização do Lobby > StartSpawn, especialmente se você as nomeou de forma diferente do que foi instruído na aula.
  • Verifique se módulos são necessários em cada script usando a função require() e spelled corretamente.

Mandando Jogadores para a Arena

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

  1. Vá para o script PlayerManager , abaixo de onPlayerJoin(), adicione uma nova função local chamada preparePlayer(). Inclua dois parâmetros: 1> jogador1> e 4> whichSpawn4>, 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 Modulo
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Defina a localização de ressurgimento do jogador para whichSpawn.


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


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

Mandando Jogadores para Spawn

Certifique-se de que cada jogador seja teletransportado para um local de spawn diferente na arena usando um loop for para iteração através do matriz / listade jogadores ativos. Usando um loop for permite que você vá através de cada valor 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 ao obter as crianças da pasta Arena > SpawnLocations.


    --Funções de Modulo
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Adicione o for loop abaixo para obter um conjunto de todos os jogadores e, em seguida, itere através de 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

Rastreamento e Spawn

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

  1. No for loop, use table.insert(), usando os dois parâmetros para o arranque activePlayers 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 spawnLocation e defin-a no índice primeiro na tabela arenaSpawns.


    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, desde que essa localização de spawn foi usada, 1> remova1> dela da tabela para que o próximo jogador obtenha um diferente Gerar.


    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 reaparecer na mesma localização, pois o código para enviá-los de volta para o 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(), verifique se há duas fechaduras de pais, como Class.Players.GetPlayers(|Players:GetPlayers()) na declaração.
  • Verifique a série de chamadas de função nos scripts de módulo. Por exemplo, matchManager.prepareGame() deve chamar playerManager.sendPlayersToMatch() .

Dando Poderes aos Jogadores

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

Adicionando uma Ferramenta

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

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

  2. Coloque a arma em ServerStorage. Se você estiver criando sua própria ferramenta, certifique-se de que a ferramenta tenha o nome Arma, pois ela será usada em scripts posteriores.

Dando Ferramentas aos Jogadores

Agora que a ferramenta está em armazenamento, trabalhe em um script para passar pelo armazenamento de usuários ativo e fornecer a cada usuário que ferramenta.

  1. In PlayerManager, add a variable named playerWeapon for the Weapon in 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
  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 espada e use a função Clone() para criar uma cópia da arma no ServerStorage. Em seguida, pai a espada para o 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 todos os jogadores recebem uma ferramenta quando enviados para a arena. Observe que, se você continuar testando, a intermissão será reiniciada e, portanto, os jogadores serão respawnados a cada alguns segundos. Isso será resolvido na próxima aula.

Scripts Concluídos

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

Script do GameManager


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

Script do MatchManager


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

Script do Módulo PlayerManager


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 Modulo
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