Crea una GUI or Intefaccia grafica utente

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

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.

Durante l'intermissione
>

Durante una Partita
>

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.

  1. Nella cartella StarterGUI, crea una nuova ScreenGUI. Quindi in ScreenGUI, aggiungi un nuovo TextLabel chiamato StatusText.

  2. 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.

  1. 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!".

  2. 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.

  3. 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.

  1. Codifica una nuova funzione chiamata updateText() . In quella funzione, imposta la proprietà Text di textLabel a status.Value .


    local textLabel = script.Parent
    local function updateText()
    textLabel.Text = status.Value
    end
  2. Collega la funzione all'evento Modificato.


    local function updateText()
    textLabel.Text = status.Value
    end
    status.Changed:Connect(updateText)
  3. Quindi i giocatori vedono lo stato più aggiornato quando avviano il Gioco, eseguono updateText() alla fine dello script.


    local function updateText()
    textLabel.Text = status.Value
    end
    status.Changed:Connect(updateText)
    updateText()
  4. 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.

  1. In ServerStorage > ModuleScripts , crea un nuovo script del modulo con il nome DisplayManager.Rinomina la tabella del modulo per abbinare il nome dello script.

  2. Aggiungi le variabili locali per quanto Seguendo: Replicated Storage, folder DisplayValues, Stato.


    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")
    -- Funzioni locali
    -- Funzioni del modulo
    return DisplayManager
  3. Crea 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 modulo
    function DisplayManager.updateStatus(newStatus)
    status.Value = newStatus
    end

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.

  1. In ServerScriptService > GameManager, crea una variabile chiamata displayManager e richiedi il modulo DisplayManager in ServerStorage.


    -- Servizi
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Script del modulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local roundManager = require(moduleScripts:WaitForChild("RoundManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
  2. Come la prima linea dopo la dichiarazione while true do , chiama displayManager > updateStatus() e passa un messaggio sull'attesa dei giocatori.


    -- Eventi
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
    while true do
    displayManager.updateStatus("Waiting for Players")
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    matchEnd.Event:Wait()
    end
  3. Dopo 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 do
    displayManager.updateStatus("Waiting for Players")
    repeat
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    displayManager.updateStatus("Get ready!")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    matchEnd.Event:Wait()
    end
  4. Prova 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.

  1. In ReplicatedStorage > DisplayValues, crea due IntValues chiamati PlayersLeft e TimeLeft.

  2. In DisplayManager, aggiungi le variabili per memorizzare i valori a sinistra dei giocatori e il tempo rimanente.


    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")
  3. 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 locali
    local function updateRoundStatus()
    status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.Value
    end
  4. Per entrambe le variabili IntValue, connetti updateRoundStatus() all'evento Modificato.


    -- Funzioni del modulo
    function DisplayManager.updateStatus(newStatus)
    status.Value = newStatus
    end
    playersLeft.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.

  1. In PlayerManager, aggiungi le variabili locali per il servizio ReplicatedStorage, la cartella DisplayValues e l'IntValue IntValue di PlayersLeft.


    local PlayerManager = {}
    -- Servizi
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    -- Variabili di mappa
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Valori
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local playersLeft = displayValues:WaitForChild("PlayersLeft")
  2. 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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(availableSpawnPoints, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
    playersLeft.Value = #activePlayers
    end

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.

  1. In MatchManager, crea le variabili per archiviare il servizio ReplicatedStorage , la cartella DisplayValues e il valore TimeLeft.


    local MatchManager = {}
    -- Servizi
    local ServerStorage = game:GetService("ServerStorage")
    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")
    -- Valori
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local timeLeft = displayValues:WaitForChild("TimeLeft")
    local myTimer = timer.new()
  2. 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ù preciso
    task.wait()
    end

    Quando 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ù preciso
    task.wait()
    end
    end
  3. Esegui 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


-- Servizi
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Script del modulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
-- Eventi
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
while true do
displayManager.updateStatus("Waiting for Players")
repeat
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
displayManager.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()