Codifica il ciclo di gioco

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

Con la mappa creata, è il momento di iniziare a costruire gli script.Il resto di questo corso si concentrerà pesantemente sullo scripting di tutti gli elementi diversi del ciclo di gioco.

Configura gli script

La battaglia royale utilizzerà una combinazione di script di modulo e script normali. Ecco gli script e le loro funzioni.

GiocoManagerScript. Esegue le funzioni dal Match Manager utilizzando le variabili dalle Impostazioni di gioco
Gestore della PartitaScript del modulo. Esegue funzioni come l'invio di giocatori in un'arena o il tracciamento del tempo in una Corrisponde.
Impostazioni di giocoScript del modulo. Memorizza le variabili comunemente utilizzate utilizzate da altri script.

scriptdelle impostazioni di gioco

Crea uno script del modulo chiamato GameSettings per memorizzare le variabili utilizzate da altri script, come la durata della partita e dell'intervallo.Queste variabili verranno utilizzate dallo script GameManager in seguito.

  1. In ServerStorage , crea una cartella chiamata ModuleScripts. In quella cartella, crea un nuovo script di modulo chiamato GameSettings.

  2. Apri GameSettings e rinomina la tabella del modulo per corrispondere al nome dello script.


    local GameSettings = {}
    return GameSettings
  3. Nella tabella del modulo, aggiungi le variabili per i seguenti usi. Prendi la tua migliore stima per ciascun valore, puoi sempre cambiarlo in seguito durante le prove.

    • Durata dell'intervallo - Secondi i giocatori attendono prima di una Corrisponde.
    • Durata della partita - Lunghezza di una partita in secondi.
    • Minimo giocatori - Numero più piccolo di giocatori necessari per Iniziare, cominciare.
    • Tempo di transizione - Tempo prima e dopo una partita in secondi. Rende la transizione tra le parti del ciclo di gioco meno improvvisa.

    local GameSettings = {}
    -- Variabili di gioco
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

scriptdi MatchManager

Il secondo script connesso al GameManager è il MatchManager.Questo script gestisce le attività come l'avvio del timer o il ripristino dei giocatori una volta terminata la partita.

All'interno di MatchManager c'è una funzione chiamata termina il gioco trasformando i giocatori nella Corrisponde.

  1. In ServerStorage > ModuleScripts > aggiungi uno script del modulo con il nome MatchManager. Rinomina la tabella del modulo.


    local MatchManager = {}
    return MatchManager
  2. Aggiungi una nuova funzione del modulo a MatchManager chiamata prepareGame(). Includi una dichiarazione di stampa per testare lo script in seguito.


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

Codifica il ciclo di gioco

Il ciclo di gioco principale verrà codificato nello script GameManager utilizzando le variabili appena create.Ricorda, ci sono tre fasi nel ciclo di gioco: intermissione, competizione e pulizia e ripristino.

scriptdi GameManager

Questo script è uno script del server normale, quindi mettilo nel ServerScriptService, piuttosto che nella cartella degli script del modulo.Il ciclo di gioco effettivo sarà in un ciclo while true.

  1. In ServerScriptService, crea un nuovo script chiamato GameManager.

  2. Aggiungi una variabile per il servizio "ServerStorage", dove sono presenti i ModuliScript.Quindi aggiungi una variabile per il servizio "Giocatori", che sarà necessaria per controllare il numero di giocatori durante le intermissioni.


    -- Servizi
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Per utilizzare i moduli creati in precedenza:

    • Imposta una variabile di nome moduleScripts alla posizione della cartella ModuleScripts.
    • Aggiungi le variabili denominate matchManager e gameSettings. Imposta ciascuna variabile a richiedere il rispettivo script.

    -- 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"))
  4. Dopo le variabili, aggiungi un ciclo while true do . Tutte le fasi del ciclo di gioco andranno all'interno per essere ripetute all'infinito.


    -- Script del modulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Ciclo di gioco principale
    while true do
    end

Codifica l'intervallo

Mentre il ciclo di gioco si esegue indefinitamente, l'intervallo dovrebbe interrompere il ciclo e continuare solo quando ci sono abbastanza giocatori per una Corrisponde.Per codificare questa pausa, includi un ciclo di ripetizione anidato per l'intermissione nel ciclo while.Quel ciclo nidato si ripeterà fino a quando ci saranno abbastanza giocatori, interrompendo il ciclo principale.Una volta che ci sono abbastanza giocatori, esce e transita i giocatori in una Corrisponde.

Con un ciclo di ripetizione ripetuto , il codice nel ciclo verrà eseguito almeno una volta.A differenza di un ciclo while, non controlla la sua condizione fino alla fine del ciclo.Questo garantisce che i giocatori vadano sempre alla lobby prima di una Corrisponde.

  1. Nel ciclo while true do , digita repeat e premi Enter per completare automaticamente con la parola chiave until .


    while true do
    repeat
    until
    end
  2. Verifica se il numero attuale di giocatori (#Players:GetPlayers()) è maggiore o uguale alla variabile minimumPlayers creata in precedenza nel modulo GameSettings.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. Nel ciclo di ripetizione, aggiungi una dichiarazione di stampa che dice che l'interruzione sta iniziando.Usa task.wait() per pausare per l'intervallo usando intermissionDuration da GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Prova e controlla che la dichiarazione di stampa "Starting intermission" venga mostrata almeno due volte.Vedere il messaggio due volte dimostra che il ciclo di ripetizione non ha trovato abbastanza giocatori e ha funzionato di nuovo.Dovrai aspettare la durata dell'intervallo prima di vedere il messaggio una seconda volta.

Suggerimenti per la risoluzione dei problemi

A questo punto, se non stai spawnando come previsto, prova uno dei seguenti.

  • task.wait() dovrebbe essere all'interno del ciclo di ripetizione.Senza l'attesa, lo script verrà eseguito troppe volte in un secondo, sovraccaricando Roblox Studio e causando un errore.
  • Nel modulo Impostazioni di gioco, la variabile intermissionDuration dovrebbe essere maggiore di 1. Se è inferiore, lo script può ripetersi troppo spesso, causando problemi di rallentamento.

Fine dell'intervallo

Una volta che ci sono abbastanza giocatori, fai loro aspettare un breve periodo di transizione.Quindi, inviali nella partita chiamando la funzione prepareGame() in MatchManager.Ricorda, quella funzione stampa solo una linea, ma aggiungerai più codice più tardi.

  1. Alla fine del ciclo di ripetizione, aggiungi una dichiarazione di stampa che dice che l'interruzione è finita per testare il tuo codice.Quindi, segui con un task.wait() utilizzando la variabile transitionTime di GameSetting.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. Dopo l'attesa, chiama il prepareGame() dal modulo MatchManager.Quando il codice viene eseguito, questo stamperà solo il testo nella finestra di output.Aspetta fino alla prossima sezione per testare questo codice.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

Testa i giochi multiplayer

Al momento, per far eseguire il codice prepareGame(), deve uscire dal ciclo di ripetizione.Ma, per farlo, ci deve essere più di un Giocatore.Questo significa che se utilizzi il pulsante playtest, la funzione non verrà mai eseguita perché sei l'unico giocatore nel gioco (a meno che i tuoi giocatori minimi non siano uno).Per testare questo, dovrai simulare un Giocomultiplayer.

Avvia un Serverlocale

Per testare il codice che richiede più di un Giocatore, crea un Serverlocale.Mentre i giochi pubblicati sono normalmente sui server di Roblox, un server locale simula un gioco multiplayer sul tuo computer con giocatori simulati.

  1. Per avviare un server locale, nella scheda Test > Client e Server > imposta il menu a discesa del giocatore al numero di giocatori minimo nella variabile minPlayers di GameSetting.Questa lezione utilizza 2 giocatori.

  2. Fai clic su Inizia per avviare il Server.

  3. Attendi qualche secondo affinché il server si configuri.Saranno aperte più finestre oltre alla finestra originale di Studio.Potrebbe essere necessario consentire l'accesso a Roblox Studio da firewall o da altri software di sicurezza online.

Suggerimenti per la risoluzione dei problemi

A questo punto, non è possibile vedere i server di prova, prova uno dei seguenti.

  • Se hai problemi con l'avvio del server, controlla di nuovo l'articolo Problemi con il firewall e il router.
  • Imposta il numero di giocatori a una piccola quantità, come 2 o 3.
  • Se il problema non si risolve, prova a riavviare Studio o riavviare il computer.

Test nel Serverlocale

Vedrai più finestre quando il server inizia. Ciascuna rappresenta una diversa parte della relazione server/client.

  • Server (borderde verde) esegue il Gioco.
  • Cliente (borderi blu) simula l'esperienza di un Giocatore.
Server con bordo verde
Cliente con bordo blu

Con il server in funzione, puoi controllare se il codice ha funzionato.

  1. Trova la finestra Server con il bordo verde.Controlla la dichiarazione di stampa chiamata dallo script MatchManager.Poiché c'è un ciclo di ripetizione, vedrai le stesse dichiarazioni di stampa ripetute.

  2. Una volta terminati i test, in qualsiasi finestra, chiudi il server con il pulsante Pulisci .Questo chiude tutte le finestre Server e Client e ti riporta alla tua normale finestra Studio.

Suggerimenti per la risoluzione dei problemi

A questo punto, se le dichiarazioni di stampa previste non sono apparse, prova una delle seguenti.

  • Verifica che le funzioni come prepareGame() sono nell'ambito del ciclo while true.
  • Se la stampa da MatchManager non ha funzionato, controlla alcuni problemi comuni di risoluzione con gli script del modulo, come assicurarsi che lo script di MatchManager sia richiesto in GameManager o che prepareGame() venga aggiunto alla tabella di quel modulo.

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"))
-- Ciclo di gioco principale
while true do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

scriptdi MatchManager


local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager

scriptdelle impostazioni di gioco


local GameSettings = {}
-- Variabili di gioco
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings