Al momento, gran parte delle informazioni sul gioco è attualmente nella finestra di output, invisibile ai giocatori.Quindi i giocatori possono essere informati di ciò che sta accadendo nel Gioco, creerai un'interfaccia grafica utente (GUI or Intefaccia grafica utente) e la codificherai.
Mostra le informazioni con una GUI or Intefaccia grafica utente
Per questo gioco una etichetta di testo mostrerà lo stato del gioco attuale oltre al conteggio e al tempo dei giocatori rimanenti.


Configura l'GUI or Intefaccia grafica utente
Prima, crea un oggetto GUI dello schermo per contenere i diversi elementi di testo.Quando il giocatore muove la Telecamera, l'interfaccia utente dello schermo rimane nello stesso posto sulla loro schermata.
Per garantire che tutti i giocatori vedano lo stesso display, posiziona la GUI nella cartella StarterGUI . All'avvio del gioco, questa cartella viene copiata a tutti i giocatori.
Nella cartella StarterGUI, crea una nuova ScreenGUI. Quindi in ScreenGUI, aggiungi un nuovo TextLabel chiamato StatusText.
Per spostare l'Etichetta, nell'esploratore, seleziona StatusText.Quindi, nella vista del gioco, trascina l'etichetta dove vorresti.I tuoi numeri possono differire dal video.L'etichetta può anche essere ridimensionata utilizzando i punti di ancoraggio sugli angoli.
Script della GUI or Intefaccia grafica utente
Per riflettere i cambiamenti nel Gioco, gli script dovranno aggiornare gli elementi GUI.Ad esempio, lo Statodel gioco, se è un'interruzione o un round attivo, verrà memorizzato in un StringValue e aggiornato utilizzando gli script locali.
Configurare lo script
Lo script StatusDisplay verrà utilizzato per aggiornare l'interfaccia grafica del Giocatoreogni volta che cambia lo stato del gioco.
In ReplicatedStorage , crea una cartella chiamata DisplayValues.In quella cartella, aggiungi un StringValue chiamato Status.Per testare il valore in seguito, dargli un valore temporaneo, come "Benvenuto alla battaglia!".
In StarterGUI > ScreenGUI > Stato, aggiungi un nuovo script locale chiamato StatusDisplay. Gli script che influiscono sull'interfaccia utente sono spesso parentedati a quell'elemento GUI.
Apri Stato di visualizzazione e definisci le seguenti variabili per il Seguire:
Servizio ReplicatedStorage
Cartella Valori da mostra
Valore Stringa Stato
TextLabel - usa script.Parent .
local ReplicatedStorage = game:GetService("ReplicatedStorage")local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local textLabel = script.Parent
Cambia la Etichettadel testo
Per cambiare il testo nell'Etichetta, usa un evento Modificato in modo che ogni volta che la stringa Stato viene modificata da un altro script, l'etichetta del testo verrà aggiornata.
Codifica una nuova funzione chiamata updateText() . In quella funzione, imposta la proprietà Text di textLabel a status.Value .
local textLabel = script.Parentlocal function updateText()textLabel.Text = status.ValueendCollega la funzione all'evento Modificato.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)Quindi i giocatori vedono lo stato più aggiornato quando avviano il Gioco, eseguono updateText() alla fine dello script.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)updateText()Esegui il gioco e conferma di vedere il valore temporaneo sull'esibizione.
Crea il gestore di visualizzazione
Durante una Gioco, l'etichetta del testo dovrà ottenere informazioni da GameManager, MatchManager e, eventualmente, da altri script.Quindi questi diversi script possono aggiornare l'etichetta del testo quando necessario, creare uno script del modulo chiamato DisplayManager.
Configurare lo script
Poiché DisplayManager deve comunicare con altri script, sarà uno script del modulo.
In ServerStorage > ModuleScripts , crea un nuovo script del modulo con il nome DisplayManager.Rinomina la tabella del modulo per abbinare il nome dello script.
Aggiungi le variabili locali per quanto Seguendo: Replicated Storage, folder DisplayValues, Stato.
local DisplayManager = {}-- Servizilocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Mostra i valori utilizzati per aggiornare l'GUI or Intefaccia grafica utenteutente del giocatorelocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")-- Funzioni locali-- Funzioni del moduloreturn DisplayManagerCrea una nuova funzione del modulo chiamata updateStatus() che aggiorna la stringa nel valore Stato. Gli altri script potranno chiamare questa funzione.
-- Funzioni locali-- Funzioni del modulofunction DisplayManager.updateStatus(newStatus)status.Value = newStatusend
Aggiorna lo Statodel testo
Con il Display Manager configurato, può essere utilizzato in altri script per aggiornare l'Etichettadel testo GUI.Come primo messaggio nella GUI or Intefaccia grafica utente, mostra l'inizio e la fine dell'intervallo attraverso lo script GameManager.
In ServerScriptService > GameManager, crea una variabile chiamata displayManager e richiedi il modulo DisplayManager in ServerStorage.
-- Servizilocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local roundManager = require(moduleScripts:WaitForChild("RoundManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))Come la prima linea dopo la dichiarazione while true do , chiama displayManager > updateStatus() e passa un messaggio sull'attesa dei giocatori.
-- Eventilocal 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()endDopo la fine del ciclo di ripetizione per l'intervallo, chiama updateStatus() e passa una stringa che annuncia l'inizio della partita.Poiché sarai in test con la GUI or Intefaccia grafica utente, elimina le due dichiarazioni di stampa per notare l'inizio e la fine dell'intervallo.
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()endProva il gioco con e senza i tuoi giocatori minimi. Il messaggio dovrebbe leggere quanto Seguendo:
- Senza i giocatori minimi: "Waiting for Players" .
- Con il minimo dei giocatori: "Get ready" .
Suggerimenti per la risoluzione dei problemi
A questo punto, se l'etichetta del testo non visualizza il primo Messaggio, o visualizza ancora "Etichetta", prova uno dei seguenti.
- Assicurati che nel script locale StatusDisplay che updateText() venga chiamato in fondo allo script.Questo garantisce che il giocatore riceva il Messaggiopiù aggiornato.
- Verifica che il valore StringValue dello stato sia in ReplicatedStorage.A causa della natura unica delle relazioni client-server, se è in ServerStorage, uno script locale non sarà in grado di trovarlo.
Statolo stato della partita
Durante una Corrisponde, l'interfaccia grafica mostrerà due numeri: il numero rimanente di giocatori e il tempo. Mentre questi numeri cambiano, anche l'etichetta del testo cambia.
Imposta valori e funzioni
I valori Int saranno utilizzati per memorizzare il numero di giocatori e il tempo rimanente.
In ReplicatedStorage > DisplayValues, crea due IntValues chiamati PlayersLeft e TimeLeft.
In DisplayManager, aggiungi le variabili per memorizzare i valori a sinistra dei giocatori e il tempo rimanente.
local DisplayManager = {}-- Servizilocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Mostra i valori utilizzati per aggiornare l'GUI or Intefaccia grafica utenteutente del giocatorelocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")Crea una funzione locale chiamata updateMatchStatus() . Quindi, imposta il valore di stato per visualizzare il numero di giocatori rimanenti e il tempo rimanente.
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")-- Funzioni localilocal function updateRoundStatus()status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.ValueendPer entrambe le variabili IntValue, connetti updateRoundStatus() all'evento Modificato.
-- Funzioni del modulofunction DisplayManager.updateStatus(newStatus)status.Value = newStatusendplayersLeft.Changed:Connect(updateRoundStatus)timeLeft.Changed:Connect(updateRoundStatus)return DisplayManager
Mostra giocatori
Successivamente, aggiungi il codice per visualizzare il numero di giocatori all'inizio di una Gioco.Lezioni successive aggiorneranno il valore PlayersLeft mentre i giocatori vengono eliminati dalla Gioco.
In PlayerManager, aggiungi le variabili locali per il servizio ReplicatedStorage, la cartella DisplayValues e l'IntValue IntValue di PlayersLeft.
local PlayerManager = {}-- Servizilocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Variabili di mappalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Valorilocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local playersLeft = displayValues:WaitForChild("PlayersLeft")Mostra il conteggio dei giocatori iniziali impostando il valore di playersLeft a quello dell'vettoredei giocatori attivi.
Quindi, in sendPlayersToMatch() , sotto il ciclo for, inserisci / scrivi: 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
Mostra il timer
Ricorda che gli script del modulo vengono utilizzati per centralizzare il codice simile.Poiché il timer viene tracciato in MatchManager, aggiorna il valore TimeLeft utilizzando le funzioni dello script Timer.Il gestore di visualizzazione ascolterà le modifiche a TimeLeft e si aggiornerà per corrispondere al nuovo valore.
In MatchManager, crea le variabili per archiviare il servizio ReplicatedStorage , la cartella DisplayValues e il valore TimeLeft.
local MatchManager = {}-- Servizilocal ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Eventilocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")-- Valorilocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local timeLeft = displayValues:WaitForChild("TimeLeft")local myTimer = timer.new()Trova la funzione startTimer() . Dopo l'evento del timer Finished, copia e pasta l'intero, evidenziato mentre lo script è in esecuzione qui sotto.Il codice esegue un ciclo per aggiornare il valore timeLeft finché il timer è ancora attivo.
while myTimer:isRunning() do-- Aggiungere +1 assicura che la visualizzazione del timer finisca a 1 invece di 0.timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1-- Non impostando l'ora di attesa, offre un looping più precisotask.wait()endQuando viene aggiunto, il codice dovrebbe assomigliare all'esempio seguente.
local function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)while myTimer:isRunning() do-- Aggiungere +1 assicura che la visualizzazione del timer finisca a 1 invece di 0.timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1-- Non impostando l'ora di attesa, offre un looping più precisotask.wait()endendEsegui il gioco con il minimo dei giocatori. Controlla che il testo dello stato venga visualizzato:
- La quantità corretta di giocatori di partenza. Ricorda, questo numero non cambierà fino a quando non verrà aggiunto un codice aggiuntivo in una lezione futura.
- Il tempo diminuisce ogni secondo fino a quando non si ferma a 1.
Script completati
Di seguito sono completati gli script per controllare due volte il tuo lavoro.
scriptdi GameManager
-- Servizilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))-- Eventilocal 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
scriptdi DisplayManager
local DisplayManager = {}
-- Servizi
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Mostra i valori utilizzati per aggiornare l'GUI or Intefaccia grafica utenteutente del giocatore
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local status = displayValues:WaitForChild("Status")
local playersLeft = displayValues:WaitForChild("PlayersLeft")
local timeLeft = displayValues:WaitForChild("TimeLeft")
-- Funzioni locali
local function updateRoundStatus()
status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.Value
end
-- Funzioni del modulo
function DisplayManager.updateStatus(newStatus)
status.Value = newStatus
end
playersLeft.Changed:Connect(updateRoundStatus)
timeLeft.Changed:Connect(updateRoundStatus)
return DisplayManager
scriptdi MatchManager
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Script del modulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Eventi
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Valori
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local timeLeft = displayValues:WaitForChild("TimeLeft")
local myTimer = timer.new()
-- Funzioni locali
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
-- Aggiungere +1 assicura che la visualizzazione del timer finisca a 1 invece di 0.
timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1
-- Non impostando l'ora di attesa, offre un looping più preciso
task.wait()
end
end
-- Funzioni del modulo
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
scriptdi visualizzazione stato
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()