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.
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 Moduloreturn PlayerManagerAdicionar 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ç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 Moduloreturn PlayerManagerCrie uma função de módulo chamada sendPlayersToMatch() com um print de teste dentro.
-- Funções Locais-- Funções de Modulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn 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.
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 Locaislocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendAdicione 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 Modulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- EventosPlayers.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.
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ç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 são gerados no Lobby.
- A declaração de impressão do PlayerManager aparece na janela de saída.
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() .
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 Locaislocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Funções de Modulofunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endDefina a localização de ressurgimento do jogador para whichSpawn.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendForç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 = whichSpawnplayer: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.
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 Modulofunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endAdicione 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() doendend
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.
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() dotable.insert(activePlayers, whichPlayer)endendPara 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endChame 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() 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 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.
Importe a arma da Caixa de Ferramentas ou crie a sua própria (veja Tools ).
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.
In PlayerManager, add a variable named playerWeapon for the Weapon in ServerStorage.
-- 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 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 = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendTeste 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ç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
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