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.
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óduloreturn PlayerManagerAdicione 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çoslocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Variáveis de Mapalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variáveis do Jogadorlocal activePlayers = {}-- Funções Locais-- Funções de Móduloreturn PlayerManagerCrie uma função de módulo chamada sendPlayersToMatch() com uma impressão de teste dentro.
-- Funções Locais-- Funções de Módulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn 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.
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 Locaislocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendAdicione 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ódulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- EventosPlayers.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.
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çoslocal ServerStorage = game:GetService("ServerStorage")-- Scripts de Módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerUse 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.
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().
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 Locaislocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Funções de Módulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endDefina a localização de respawn do jogador em whichSpawn.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendForce o personagem a recarregar, usando LoadCharacter(), e o jogador respawnará usando sua nova localização atribuída.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer: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.
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ódulofunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endAdicione 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() doendend
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.
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() dotable.insert(activePlayers, whichPlayer)endendPara 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endChame 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTeste 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.
Importe a arma da Caixa de Ferramentas, ou crie a sua própria (veja Tools ).
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.
No PlayerManager, adicione uma variável chamada playerWeapon para a Arma no Armazenamento do Servidor.
-- Variáveis de Mapalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variáveis do Jogadorlocal activePlayers = {}local playerWeapon = ServerStorage.WeaponEm preparePlayer(), cole o seguinte código para obter o personagem do jogador.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endCrie 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 = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendTeste 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çoslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de Módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("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