No momento, muita da informação do jogo está atualmente na janela de Saída, invisível para os jogadores.Assim, os jogadores podem ser informados do que está acontecendo no jogo, você criará uma interface gráfica de usuário (Interface gráfica do usuário) e a codificará.
Exibir informações com uma Interface gráfica do usuário
Para este jogo, uma etiqueta de texto exibirá o status do jogo atual, bem como o número restante de jogadores e o tempo.


Configurar a Interface gráfica do usuário
Primeiro, crie um objeto GUI da tela para conter os diferentes elementos de texto.Quando o jogador move a Câmera, a GUI da tela permanece no mesmo lugar em sua tela.
Para garantir que todos os jogadores vejam o mesmo display, coloque a GUI na pasta StarterGUI . Na inicialização do jogo, esta pasta é copiada para todos os jogadores.
Na pasta StarterGUI, crie um novo ScreenGui. Em seguida, no ScreenGui, adicione um novo TextLabel chamado StatusText.
Para mover a etiqueta / rótulo, no Explorador, selecione StatusText.Então, na visualização do jogo, arraste a etiqueta para onde você gostaria.Seus números podem diferir do vídeo.A etiqueta também pode ser redimensionada usando os pontos de âncora nos cantos.
Scriptar a Interface gráfica do usuário
Para refletir as alterações no jogo, os scripts precisarão atualizar os elementos da GUI.Por instância, o status do jogo, se for uma intermissão ou rodada ativa, será armazenado em um StringValue e atualizado usando scripts locais.
Configure o script
O script StatusDisplay será usado para atualizar a GUI do jogador sempre que o estado do jogo mudar.
Em ReplicatedStorage , crie uma pasta chamada DisplayValues.Nessa pasta, adicione um StringValue chamado Status.Para testar o valor mais tarde, dê a ele um valor temporário, como "Bem-vindo à Batalha!".
No StarterGui > ScreenGui > Status, adicione um novo script local chamado StatusDisplay. Scripts que afetam a GUI são frequentemente parentados a esse elemento da GUI.
Abra o StatusDisplay e defina as seguintes variáveis para a seguir:
Serviço ReplicatedStorage
Pasta de Valores a Mostrar
Valor da String de Status
TextLabel - use script.Parent .
local ReplicatedStorage = game:GetService("ReplicatedStorage")local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local textLabel = script.Parent
Altere a etiqueta / rótulode texto
Para alterar o texto no etiqueta / rótulo, use um evento Alterado sempre que a string de status for alterada por outro script, o rótulo de texto será atualizado.
Codifique uma nova função chamada updateText(). Nessa função, defina a propriedade Texto de textLabel para status.Value.
local textLabel = script.Parentlocal function updateText()textLabel.Text = status.ValueendConecte a função ao evento Alterado.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)Assim, os jogadores veem o status mais atual quando iniciam o jogo, execute updateText() no final do script.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)updateText()Execute o jogo e confirme que você veja o valor temporário no display.
Crie o gerenciador de exibição
Durante um jogo, o rótulo de texto precisará obter informações do Gerenciador de Jogo, Gerenciador de Partida e, possivelmente, de outros scripts.Então, esses diferentes scripts podem atualizar a etiqueta de texto quando necessário, criar um script de módulo chamado DisplayManager.
Configure o script
Como o DisplayManager precisa se comunicar com outros scripts, será um script de módulo.
Em Armazenamento do Servidor > ModuleScripts , crie um novo script de módulo chamado DisplayManager.Renomeie a tabela de módulo para combinar com o nome do script.
Adicione variáveis locais para o seguindo: Armazenamento Replicado, pasta DisplayValues, Status.
local DisplayManager = {}-- Serviçoslocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Exibir valores usados para atualizar a Interface gráfica do usuáriodo Jogadorlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")-- Funções Locais-- Funções de Móduloreturn DisplayManagerCrie uma nova função de módulo chamada updateStatus() que atualiza a string no valor de Status. Outros scripts poderão chamar essa função.
-- Funções Locais-- Funções de Módulofunction DisplayManager.updateStatus(newStatus)status.Value = newStatusend
Atualizar o status do texto
Com o Gerenciador de Exibição configurado, ele pode ser usado em outros scripts para atualizar a etiqueta / rótulode texto da GUI.Como a primeira mensagem na Interface gráfica do usuário, mostre o início e o fim da intermissão através do script GameManager.
Em Serviço de Script de Servidor > GameManager, crie uma variável chamada displayManager e exija o módulo DisplayManager no Armazenamento de Servidor.
-- Serviçoslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de Módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local roundManager = require(moduleScripts:WaitForChild("RoundManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))Como a primeira linha após a declaração while true do, chame o displayManager > e passe uma mensagem sobre a espera por jogadores.
-- Eventoslocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dodisplayManager.updateStatus("Waiting for Players")repeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayerstask.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()endApós o fim do ciclo de repetição para a intermissão, chame updateStatus() e passe uma string que anuncia que a partida está começando.Como você vai testar com a Interface gráfica do usuário, exclua as duas declarações de impressão para notar o início e o fim da intermissão.
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()endTeste o jogo com e sem seus jogadores mínimos. A mensagem deve ler o seguindo:
- Sem os jogadores mínimos: "Waiting for Players" .
- Com os mínimos jogadores: "Get ready" .
Dicas de solução de problemas
Neste ponto, se a etiqueta de texto não exibir a primeira mensagem ou ainda exibir "Label", tente uma das seguintes opções.
- Certifique-se no script local StatusDisplay que updateText() seja chamado no final do script.Isso garante que o jogador receba a mensagem mais atual.
- Verifique se o valor da string de status está no ReplicatedStorage.Devido à natureza única das relações cliente-servidor, se estiver no Armazenamento do Servidor, um script local não será capaz de encontrá-lo.
Exibir o status da partida
Durante uma conferir, a GUI exibirá dois números: contagem de jogadores restantes e tempo. À medida que esses números mudam, a etiqueta de texto também muda.
Definir valores e funções
Os IntValues serão usados para armazenar o número de jogadores e o tempo restante.
No ReplicatedStorage > DisplayValues, crie dois IntValues chamados PlayersLeft e TimeLeft.
No DisplayManager, adicione variáveis para armazenar os valores de tempo restante e os jogadores restantes.
local DisplayManager = {}-- Serviçoslocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Exibir valores usados para atualizar a Interface gráfica do usuáriodo Jogadorlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")Crie uma função local chamada updateMatchStatus(). Então, defina o valor de status para exibir o número de jogadores restantes e o tempo restante.
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")-- Funções Locaislocal function updateRoundStatus()status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.ValueendPara ambas variáveis IntValue, conecte updateRoundStatus() ao evento Alterado.
-- Funções de Módulofunction DisplayManager.updateStatus(newStatus)status.Value = newStatusendplayersLeft.Changed:Connect(updateRoundStatus)timeLeft.Changed:Connect(updateRoundStatus)return DisplayManager
Exibir jogadores
Em seguida, adicione o código para exibir o número de jogadores no início de um jogo.As lições posteriores atualizarão o valor de PlayersLeft à medida que os jogadores são eliminados do jogo.
No PlayerManager, adicione variáveis locais para o serviço ReplicatedStorage, pasta DisplayValues e IntValue de PlayersLeft.
local PlayerManager = {}-- Serviçoslocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Variáveis de Mapalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Valoreslocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local playersLeft = displayValues:WaitForChild("PlayersLeft")Mostre o número inicial de jogadores definindo o valor de playersLeft para o tamanho do matriz / listade jogadores ativos.
Então, em sendPlayersToMatch() , sob o loop for, digitar: playersLeft.Value = #activePlayers
function PlayerManager.sendPlayersToMatch()local availableSpawnPoints = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(availableSpawnPoints, 1)preparePlayer(whichPlayer, spawnLocation)endplayersLeft.Value = #activePlayersend
Exibir o relógio
Lembre-se que os scripts de módulo são usados para centralizar código semelhante.Como o cronômetro é rastreado no MatchManager, atualize o valor TimeLeft usando funções do script Timer.O gerenciador de exibição ouvirá as alterações no TimeLeft e atualizará para corresponder ao novo valor.
No MatchManager, crie variáveis para armazenar o serviço ReplicatedStorage , a pasta DisplayValues e o valor TimeLeft.
local MatchManager = {}-- Serviçoslocal ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Scripts de Módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Eventoslocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")-- Valoreslocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local timeLeft = displayValues:WaitForChild("TimeLeft")local myTimer = timer.new()Encontre a função startTimer() . Após o evento do cronômetro Finished, copie e cole todo o conteúdo, destacado enquanto loop abaixo.O código executa um loop para atualizar o valor timeLeft enquanto o cronômetro ainda estiver ativo.
while myTimer:isRunning() do-- Adicionar +1 garante que a exibição do tempo termine em 1 ao invés de 0.timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1-- Ao não definir o tempo para espera, oferece um looping mais precisotask.wait()endAo ser adicionado, o código deve parecer com o exemplo abaixo.
local function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)while myTimer:isRunning() do-- Adicionar +1 garante que a exibição do tempo termine em 1 ao invés de 0.timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1-- Ao não definir o tempo para espera, oferece um looping mais precisotask.wait()endendExecute o jogo com o mínimo de jogadores. Verifique se o texto de status é exibido:
- A quantidade correta de jogadores iniciais. Lembre-se, esse número não mudará até que seja adicionado código adicional em uma lição futura.
- O tempo diminui a cada segundo até parar em 1.
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"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))-- Eventoslocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()end
scriptdo Gerenciador de Exibição
local DisplayManager = {}
-- Serviços
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Exibir valores usados para atualizar a Interface gráfica do usuáriodo Jogador
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local status = displayValues:WaitForChild("Status")
local playersLeft = displayValues:WaitForChild("PlayersLeft")
local timeLeft = displayValues:WaitForChild("TimeLeft")
-- Funções Locais
local function updateRoundStatus()
status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.Value
end
-- Funções de Módulo
function DisplayManager.updateStatus(newStatus)
status.Value = newStatus
end
playersLeft.Changed:Connect(updateRoundStatus)
timeLeft.Changed:Connect(updateRoundStatus)
return DisplayManager
scriptdo Gerenciador de Partida
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Scripts de Módulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Eventos
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Valores
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local timeLeft = displayValues:WaitForChild("TimeLeft")
local myTimer = timer.new()
-- Funções Locais
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
while myTimer:isRunning() do
-- Adicionar +1 garante que a exibição do tempo termine em 1 ao invés de 0.
timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1
-- Ao não definir o tempo para espera, oferece um looping mais preciso
task.wait()
end
end
-- Funções de Módulo
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
scriptde exibição de status
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local status = displayValues:WaitForChild("Status")
local textLabel = script.Parent
local function updateText()
textLabel.Text = status.Value
end
status.Changed:Connect(updateText)
updateText()