Con la mappa creata, è ora di iniziare a costruire gli script. Il resto di questo corso si concentra principalmente sulla programmazione di tutti gli elementi del game loop.
Configurazione degli script
Il battle royale userà una combinazione di script del modulo e script normali. Di seguito sono gli script e le loro funzioni.
GameManager ] | Script. Esegue funzioni dal Gestore della Corrispondenza utilizzando le variabili dalle Impostazioni di Gioco |
MatchManager | Script del modulo. Esegue funzioni come l'invio di giocatori in un'arena o il mantenimento del tempo in una Corrisponde. |
Impostazioni di gioco | Script del modulo. memorizza le variabili comunemente utilizzate utilizzate da altri script. |
Script di GameSettings
Crea uno script del modulo chiamato GameSettings per memorizzare le variabili utilizzate da altri script, come la durata della partita e l'intervallo. Questi valori saranno utilizzati dal script del GameManager in seguito.
In ServerStorage , crea una cartella chiamata ModuleScripts. In that cartella, crea uno script di modulo chiamato GameSettings.
Apri GameSettings e rinomina la tabella del modulo per corrispondere al nome dello script.
local GameSettings = {}return GameSettingsNella tabella dei moduli, aggiungi variabili per i seguenti utilizzi. Prendi la tua migliore indovinanza per ciascun valore, puoi sempre cambiarlo in seguito mentre testi.
- Durata della interruzione - Secondi i giocatori aspettano prima di una Corrisponde.
- Durata della corrispondenza - Lunghezza di una corrispondenza in secondi.
- Minimum Players - Numero minimo di giocatori richiesti per Iniziare, cominciare.
- Tempo di transizione - Tempo prima e dopo una partita in secondi. Rende il passaggio tra le parti del flusso di gioco meno improvviso.
local GameSettings = {}-- Variabili di giocoGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
Script del MatchManager
Il secondo script connesso a 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 prepareGame() che inizia il gioco trasformando i giocatori nella Corrisponde.
In ServerStorage > ModuleScripts > aggiungi uno script del modulo chiamato MatchManager. Rinomina la tabella del modulo.
local MatchManager = {}return MatchManagerAggiungi 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!")endreturn MatchManager
Codice del Game Loop
Il principale game loop sarà codificato nel script GameManager utilizzando le variabili appena create. Ricorda, ci sono tre fasi nel game loop: interruzione, competizione e pulizia e Ripristina.
Script del GameManager
Questo script è uno script del server normale, quindi mettilo in ServerScriptService, piuttosto che nel modulo script del modulo. Il vero game loop sarà in un while true do loop.
In ServerScriptService, crea uno script nuovo chiamato GameManager.
Aggiungi una variabile per il servizio "ServerStorage", che è dove si trovano i Modulescripts. Quindi aggiungi una variabile per il servizio "Players", che sarà necessaria per controllare il numero di giocatori durante gli intervalli.
-- Servizilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Per utilizzare i moduli creati in precedenza:
- Imposta una variabile chiamata moduleScripts nella posizione della cartella ModulScripts.
- Aggiungi le variabili con il nome matchManager e gameSettings . Imposta ogni variabile per richiedere lo script rispettivo.
-- 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"))Dopo le variabili, aggiungi un while true do loop. Tutte le fasi del game loop andranno all'interno per essere ripetute indefinitamente.
-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Main game loopwhile true doend
Codice l'Interruzione
Mentre il ciclo di gioco viene eseguito indefinitamente, l'interruzione dovrebbe interrompere il ciclo e continuare solo quando ci sono abbastanza giocatori per una Corrisponde. Per codificare questa interruzione, includi un ciclo ripetuto indefinito per l'interruzione nella while loop. Questo ciclo ripetuto indefinito si ripetrà fino a quando ci sono abbastanza giocatori, causando l'interruzione principale. Una volta che ci sono abbastanza giocatori, eseguirà e transizione i giocatori in una Corrisponde.
Con un iteratore di ripetizione , il codice nell'iteratore viene eseguito almeno una volta. A differenza di un while loop, non controlla le sue condizioni fino alla fine dell'iteratore. Ciò garantisce che i giocatori siano sempre andati nella lobby prima di una Corrisponde.
Nel while true do loop, type repeat e press Enter per autocompletare con la parola chiave 1> until1> .
while true dorepeatuntilendControlla se il numero attuale di giocatori (#Players:GetPlayers()) è maggiore o uguale alla variabile minimumPlayers creata nel modulo GameSettings.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendNel loop di ripetizione, aggiungi una dichiarazione di stampa che dice che l'interruzione sta iniziando. Usa task.wait() per暂停 per l'interruzione usando intermissionDuration da GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendProva e assicurati che la dichiarazione di stampa "Starting intermission" sia mostrata almeno due volte. Vedere il messaggio due volte dimostra che il loop di ripetizione non ha trovato abbastanza giocatori e ha eseguito di nuovo. Avrai bisogno di aspettare la durata dell'intervallo prima di vedere il messaggio un'altra volta.
Risolvere i problemi
A questo punto, se non stai spawnando come previsto, prova uno dei seguenti.
- task.wait() dovrebbe essere all'interno del loop di ripetizione. Senza il wait, lo script eseguirà troppi 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ò ripetere troppo spesso, causando problemi di rallentamento.
Finire l'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.
Alla fine del loop di ripetizione, aggiungi una dichiarazione di stampa che dice che l'interruzione è finita per testare il tuo codice. Quindi, seguitelo con un task.wait() utilizzando la variabile GameSettings's transitionTime.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endDopo la attesa, chiama il prepareGame() dal modulo MatchManager. Quando il codice viene eseguito, questo stampa solo il testo nella finestra di uscita. Attendere fino alla prossima sezione per testare questo codice.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Testare i giochi multiplayer
In questo momento, per avere il codice in esecuzione prepareGame() , deve uscire dal loop di ripetizione. Ma, per farlo, ci deve essere più di un Giocatore. Ciò significa che se usi il pulsante playtest , la funzione non verrà mai eseguita poiché sei l'unico giocatore nel gioco (a meno che i tuoi giocatori minimi non siano uno). Per testare questo, devi simulare un Giocomultiplayer.
Avvio di un server locale
Per testare il codice che richiede più di un Giocatore, crea un Serverlocale. Mentre i giochi pubblicati sono normalmente sui server Roblox, un server locale simula un gioco multiplayer sul tuo computer con giocatori simulati.
Per avviare un Serverlocale, nella scheda Test > Client e server > imposta il player dropdown sul numero di giocatori nella variabile minimaPlayers di GameSettings. Questa lezione utilizza 2 giocatori.
Fai clic su Inizia per iniziare il Server.
Attendere pochi secondi per l'avvio del server. Viene visualizzata più di una finestra del tuo vecchio Studio. Potrebbe essere necessario consentire l'accesso a Roblox Studio da firewall o altri software di sicurezza online.
Risolvere i problemi
A questo punto, non sei in grado di vedere i server di prova, prova uno dei seguenti sotto.
- Se hai problemi con l'avvio del server, controlla doppio il articolo Problemi con il firewall e il router.
- Imposta il numero di giocatori su un piccolo numero, come 2 o 3.
- Se l'errore non si risolve, prova a riavviare Studio o riavviare il tuo computer.
Testare sul server locale
Vedrai più finestre quando il server inizia. Ciascuna rappresenta una parte diversa del rapporto server/client.
- Server (green border) esegue il Gioco.
- Client (bluoi confini) simula l'esperienza di un Giocatore.
Con il server up, puoi controllare se il codice ha funzionato.
Trova la Server finestra con il bordo verde. Controlla la dichiarazione di stampa chiamata dalla script MatchManager. Poiché ci sono rami ripetuti, vedrai le stesse dichiarazioni di stampa ripetute.
Una volta terminato il test, in qualsiasi finestra, chiudi il server con il pulsante di pulizia . Questo chiude tutte le finestre Server e Client e ti riporta alla tua finestra di Studio normale.
Risolvere i problemi
Al momento, se le dichiarazioni di stampa intenzionali non sono apparse, prova una delle seguenti opzioni a seguire.
- Assicurati che le funzioni come prepareGame() siano in range while true do loop.
- Se la stampa da MatchManager non ha funzionato, controlla alcuni problemi comuni con gli script del modulo, come assicurarti che lo script MatchManager sia richiesto in GameManager o che prepareGame() sia aggiunto alla tabella di quel modulo.
Script completati
Di seguito sono gli script completati per il doppio controllo del tuo lavoro.
Script del 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"))-- Main game loopwhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Script del MatchManager
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
Script di GameSettings
local GameSettings = {}-- Variabili di giocoGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings