Com o mapa criado, é hora de começar a construir os scripts.O resto deste curso se concentrará fortemente em escrever todos os diferentes elementos do ciclo do jogo.
Configurar os scripts
A batalha royale usará uma combinação de scripts de módulo e scripts normais. A seguir estão os scripts e suas funções.
Gerenciador de Jogo | Script. Executa funções do Gerenciador de Partidas usando variáveis das Configurações do Jogo |
Gerenciador de Partida | Script de módulo. Executa funções como enviar jogadores para uma arena ou acompanhar o tempo em uma conferir. |
Configurações do Jogo | Script de módulo. Armazena variáveis comumente usadas usadas por outros scripts. |
scriptde Configurações do Jogo
Crie um script de módulo chamado GameSettings para armazenar variáveis usadas por outros scripts, como duração de partida e intermissão.Essas variáveis serão usadas pelo script GameManager mais tarde.
Em Armazenamento do Servidor , crie uma pasta chamada ModuleScripts. Nessa pasta, crie um novo script de módulo chamado GameSettings.
Abra as Configurações do Jogo e renomeie a tabela de módulos para corresponder ao nome do script.
local GameSettings = {}return GameSettingsNa tabela de módulos, adicione variáveis para os seguintes usos. Use sua melhor estimativa para cada valor, você sempre pode alterá-lo mais tarde durante o teste.
- Duração da intermissão - Segundos os jogadores esperam antes de uma conferir.
- Duração da partida - Comprimento de uma partida em segundos.
- Jogadores Mínimos - Menor número de jogadores necessários para iniciar.
- Tempo de transição - Tempo antes e depois de uma partida em segundos. Torna a transição entre partes do ciclo de jogo menos repentina.
local GameSettings = {}-- Variáveis do jogoGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
scriptdo Gerenciador de Partida
O segundo script conectado ao GameManager é o MatchManager.Este script gerencia tarefas como iniciar o cronômetro ou reiniciar os jogadores após o fim da partida.
Dentro do MatchManager existe uma função chamada prepareGame() que inicia o jogo ao fazer a transição de jogadores para a conferir.
No Armazenamento de Servidor > ModuleScripts > adicione um script de módulo chamado MatchManager. Renomeie a tabela de módulo.
local MatchManager = {}return MatchManagerAdicione uma nova função de módulo ao MatchManager chamada prepareGame(). Inclua uma declaração de impressão para testar o script mais tarde.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Codifique o ciclo do jogo
O ciclo de jogo principal será codificado no script do Gerenciador de Jogo usando as variáveis acabadas de criar.Lembre-se, há três fases no ciclo do jogo: intermissão, competição e limpeza e redefinir.
scriptdo Gerenciador de Jogo
Este script é um script de servidor normal, então coloque-o no ServerScriptService, em vez do diretório de scripts de módulo.O ciclo de jogo real estará em um ciclo while verdadeiro.
No ServerScriptService, crie um novo script chamado GameManager.
Adicione uma variável para o serviço "Armazenamento do Servidor", que é onde os Modulescripts estão.Então adicione uma variável para o serviço "Jogadores", que será necessária para verificar o número de jogadores durante as intermissões.
-- Serviçoslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Para usar os módulos criados anteriormente:
- Defina uma variável chamada moduleScripts na localização da pasta de ModuleScripts.
- Adicione variáveis chamadas matchManager e gameSettings. Defina cada variável para exigir seu respectivo script.
-- 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"))Depois das variáveis, adicione um while true do ciclo. Todas as fases do ciclo do jogo irão para dentro para se repetir indefinidamente.
-- Scripts de Módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Ciclo de jogo principalwhile true doend
Codifique a intermissão
Enquanto o ciclo do jogo é executado indefinidamente, a intermissão deve pausar o ciclo e só continuar quando houver suficientes jogadores para uma conferir.Para codificar essa pausa, inclua um ciclo de repetição aninhado para a intermissão no loop while.Esse ciclo aninhado se repetirá até que haja jogadores suficientes, pausando o ciclo principal.Uma vez que haja jogadores suficientes, sairá e transicionará os jogadores para uma conferir.
Com um 循环重复 , o código no loop será executado pelo menos uma vez.Ao contrário de um loop while, ele não verifica sua condição até o fim do loop.Isso garante que os jogadores sempre vão ao lobby antes de uma conferir.
No loop while true do, digite repeat e pressione Enter para preencher automaticamente com a palavra-chave until.
while true dorepeatuntilendVerifique se o número atual de jogadores (#Players:GetPlayers()) é maior ou igual à variável minimumPlayers criada anteriormente no módulo GameSettings.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendNo ciclo de repetição, adicione uma declaração de impressão dizendo que a intermissão está começando.Use task.wait() para pausar para a intermissão usando intermissionDuration de GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendTeste e verifique se a declaração de impressão "Starting intermission" é mostrada pelo menos duas vezes.Ver a mensagem duas vezes prova que o ciclo de repetição não encontrou jogadores suficientes e rodou novamente.Você terá que esperar o tempo de intermissão antes de ver a mensagem uma segunda vez.
Dicas de solução de problemas
Neste ponto, se você não estiver sendo gerado como pretendido, tente um dos seguintes abaixo.
- task.wait() deve estar dentro do loop de repetição.Sem a espera, o script será executado muitas vezes em um segundo, sobrecarregando o Roblox Studio e causando um erro.
- No módulo Configurações do Jogo, a variável intermissionDuration deve ser maior que 1. Se for menor, o script pode se repetir com muita frequência, causando problemas de desaceleração.
Acabe com a intermissão
Uma vez que há jogadores suficientes, faça-os esperar um curto período de transição.Então, envie-os para a partida chamando a função prepareGame() na Gerenciador de Partida.Lembre-se, essa função apenas imprime uma linha, mas você adicionará mais código mais tarde.
No final do ciclo de repetição, adicione uma declaração de impressão dizendo que a interrupção acabou para testar seu código.Então, siga-o com um task.wait() usando a variável transitionTime do GameSetting.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endApós a espera, chame o prepareGame() do módulo MatchManager.Quando o código é executado, isso imprimirá apenas texto na janela de Saída.Espere até a próxima seção para testar esse código.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Teste jogos multijogador
No momento, para que o código seja executado prepareGame(), precisa sair do ciclo de repetição.Mas, para fazer isso, precisa haver mais de um jogador.Isso significa que se você usar o botão de teste de jogo, a função nunca será executada porque você é o único jogador no jogo (a menos que seu número mínimo de jogadores seja um).Para testar isso, você precisará simular um jogo multijogador.
Inicie um servidor local
Para testar código que requer mais de um jogador, crie um servidor local.Enquanto jogos publicados normalmente estão em servidores do Roblox, um servidor local simula um jogo multijogador no seu computador com jogadores simulados.
Para iniciar um servidor local, na aba Teste > Clientes e Servidores > defina o menu suspenso do jogador para o número de jogadores na variável mínimaPlayers do GameSetting.Esta lição usa 2 jogadores.
Clique em Iniciar para iniciar o servidor.
Espere alguns segundos para o servidor configurar.Várias janelas serão abertas além da janela original do Studio.Talvez você precise permitir o acesso ao Roblox Studio a partir de firewalls ou outro software de segurança online.
Dicas de solução de problemas
Neste ponto, você não é capaz de ver os servidores de teste, tente um dos seguintes abaixo.
- Se você tiver quaisquer problemas com o servidor iniciando, verifique duas vezes o artigo Problemas com Firewall e Router.
- Defina o número de jogadores para uma pequena quantidade, como 2 ou 3.
- Se o problema não for resolvido, tente reiniciar o Studio ou reiniciar seu computador.
Teste no servidor local
Você verá várias janelas quando o servidor iniciar. Cada uma representa uma parte diferente da relação servidor/cliente.
- Servidor (borde verde) executa o jogo.
- Cliente (limites azuis) simula a experiência de um jogador.


Com o servidor ativo, você pode verificar se o código funcionou.
Encontre a janela Servidor com o limite verde.Verifique a declaração de impressão chamada pelo script MatchManager.Como há um ciclo de repetição, você verá as mesmas declarações de impressão se repetindo.
Uma vez que você terminar de testar, em qualquer janela, feche o servidor pelo botão Limpar.Isso fecha todas as janelas do Servidor e do Cliente e leva você de volta para a janela normal do Studio.
Dicas de solução de problemas
Neste ponto, se as declarações de impressão pretendidas não aparecerem, tente uma das seguintes abaixo.
- Verifique se funções como prepareGame() estão em escopo do loop while verdadeiro.
- Se a impressão a partir do MatchManager não funcionou, verifique alguns problemas comuns de solução com scripts de módulo, como garantir que o script do MatchManager seja necessário no GameManager ou que prepareGame() seja adicionado à tabela do módulo.
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"))-- Ciclo de jogo principalwhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
scriptdo Gerenciador de Partida
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
scriptde Configurações do Jogo
local GameSettings = {}-- Variáveis do jogoGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings