Durante il corso di un round, gli script dovranno tracciare il tempo e inviare segnali tra diversi script. Il tempo sarà gestito utilizzando uno script di tempo, mentre gli eventi, un concetto in Roblox codice, invieranno segnali come la fine di una Corrisponde.
Invio segnali con eventi
Con i giocatori ora nell'arena, gli eventi possono essere utilizzati per segnalare l'inizio della partita e il codice per il timer può iniziare. In seguito, un evento può anche essere utilizzato per segnalare la fine della Corrisponde, e che è ora di passare i giocatori alla lobby.
Questi eventi non sono pre-costruiti, quindi gli oggetti evento personalizzati chiamati eventi legabili dovranno essere creati. Gli eventi legabili sono spesso utilizzati per azioni del giocatore e sono simili agli eventi come Touched o Changed .
Più script possono ascoltare gli stessi eventi legabili. Ciò mantiene il tuo codice organizzato e rende più facile aggiungere ulteriore codice per l'avvio o la fine della partita se necessario.
Creazione di eventi legabili
Inizia creando oggetti evento legabili per l'inizio e la fine della Corrisponde. Poiché gli eventi legabili non interagiscono con il client, possono essere memorizzati nel Server Storage.
In ServerStorage, crea una nuova cartella chiamata Eventi . In quella cartella, crea due Eventi legabili chiamati MatchStart e MatchEnd.
Usa gli eventi
Al momento, quando i giocatori entrano nell'arena, l'interruzione viene riavviata in modo che non inizi il timer. Il principale ciclo di gioco deve essere detto di fermarsi e aspettare fino all'evento MatchEnd prima di passare alla prossima parte del codice.
Gli eventi hanno due funzioni built-in: Connect() e Wait(). Invece di utilizzare Connect() come prima, chiama 2>Wait2> su MatchEnd per sospendere lo script del gestore del gioco fino a quando MatchEnd non viene attivato. In questo caso, la funzione di attesa sospende lo script del gestore del gioco fino a quando il match è finito.
In GameManager , crea variabili per la cartella Events e MatchEnd .
-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Eventilocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")Fai in modo che lo script aspetti per l'evento di fine match per essere in grado di passare avanti. Nel loop, all'end, inserisci / scrivi: matchEnd.Event:Wait()
while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Il placeholder aspetta per la lunghezza del Gioco.matchEnd.Event:Wait()endProva il Gioco. Conferma che una volta che i giocatori sono nell'arena, il loop di interruzione non continua. Lo script ora sta aspettando il segnale matchEnd per Lanciare.
Risolvere i problemi
A questo punto, il codice non funziona come dovrebbe, prova uno dei seguenti sotto.
- Controlla l'uso dei trattini o dei trattini in matchEnd.Event:Wait() .
- Assicurati che MatchEnd sia un BindableEvent, non un altro inserisci / scrivi, come un RemoteEvent.
Uso di un Timer
Una delle condizioni che causeranno la fine della partita è un timer che termina, che verrà gestito attraverso lo script.
Configurazione del timer
Per aggiungere un timer nel Gioco, usa lo script del modulo prefabbricato nei passaggi seguenti. Include funzioni per avviare e terminare un timer, nonché restituire il tempo rimasto.
In ServerStorage > ModuleScripts, crea uno script del modulo nuovo chiamato Timer.
Remplace il codice con il codice seguente.
local Timer = {}Timer.__index = Timerfunction Timer.new()local self = setmetatable({}, Timer)self._finishedEvent = Instance.new("BindableEvent")self.finished = self._finishedEvent.Eventself._running = falseself._startTime = nilself._duration = nilreturn selfendfunction Timer:start(duration)if not self._running thentask.spawn(function()self._running = trueself._duration = durationself._startTime = tick()while self._running and tick() - self._startTime < duration dotask.wait()endlocal completed = self._runningself._running = falseself._startTime = nilself._duration = nilself._finishedEvent:Fire(completed)end)elsewarn("Warning: timer could not start again as it is already running.")endendfunction Timer:getTimeLeft()if self._running thenlocal now = tick()local timeLeft = self._startTime + self._duration - nowif timeLeft < 0 thentimeLeft = 0endreturn timeLeftelsewarn("Warning: could not get remaining time, timer is not running.")endendfunction Timer:isRunning()return self._runningendfunction Timer:stop()self._running = falseendreturn TimerIn MatchManager, richiedi i moduli GameSettings e Timer.
local MatchManager = {}-- Servizilocal ServerStorage = game:GetService("ServerStorage")-- 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"))Sotto le variabili, crea un nuovo oggetto timer impostando una variabile chiamata myTimer uguale a timer.new() . Questo oggetto sarà utilizzato per chiamare funzioni che avviano e fermano il timer.
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Crea un nuovo oggetto timer per essere utilizzato per tracciare il tempo della partita.local myTimer = timer.new()
Avvio e Stopping
Ora che è stato creato un timer, usa le funzioni incluse start() e stop() durante una Corrisponde. Di seguito è una descrizione di ogni funzione e del parametro che accetta.
- start(time) - Avvia il timer, con il tempo in secondi come parametro.
- finished:Connect(functionName) - Quando il timer finisce, esegue la funzione passata come parametro.
In MatchManager , crea una nuova funzione chiamata timeUp() per essere eseguita ogni volta che il timer è finito. Includi una dichiarazione di stampa di test.
local myTimer = timer.new()-- Funzioni localilocal function timeUp()print("Time is up!")end-- Funzioni del modulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerSotto timeUp() , aggiungi una funzione chiamata startTimer() con una dichiarazione di stampa. Mostrerai il timer in gioco più tardi.
-- Funzioni localilocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endPer avviare e fermare il timer, in startTimer() :
- Chiama myTimer.start() . Pass in gameSettings.matchDuration .
- Chiama myTimer.finished:Connect() . Pass in timeUp() .
-- Funzioni localilocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
Avvio del timer
Il timer può essere attivato all'inizio di una partita utilizzando l'evento Inizio partita .
In MatchManager, sotto le variabili del modulo, crea le variabili per memorizzare la cartella Eventi, MatchStart e MatchEnd (che viene utilizzata in una lezione futura).
-- 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")local matchEnd = events:WaitForChild("MatchEnd")--Crea un timerlocal myTimer = timer.new()Al di sopra di return MatchManager, connetti l'evento di avvio della partita a startTimer() .
-- Funzioni del modulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerPer avviare l'evento di avvio della partita, in prepareGame() , digita matchStart:Fire() .
-- Funzioni del modulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endProva il Gioco. Nella finestra di output, conferma di poter vedere le dichiarazioni di output per il timer di avvio e stop.
Script completati
Di seguito sono gli script completati per il doppio controllo del tuo lavoro.
Script del MatchManager
local MatchManager = {}
-- Servizi
local ServerStorage = game:GetService("ServerStorage")
-- 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")
-- Crea un nuovo oggetto timer per essere utilizzato per tracciare il tempo della partita.
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)
end
-- Funzioni del modulo
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
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"))-- Eventilocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Il placeholder aspetta per la lunghezza del Gioco.matchEnd.Event:Wait()end