Aggiungere round ti consente di strutturare il gameplay in fasi con un punto di partenza e di destinazione chiaro in modo che i giocatori possano misurare il loro progresso e avere un'opportunità periodica per un campo di gioco pari. Questo è particolarmente importante per il gameplay basato sul team poiché offre ai giocatori la possibilità di cambiare lo stile di gioco a seconda di chi è nel loro team durante quel round.
Usando la esperienza laser tag di esempio come riferimento, questa sezione del tutorial ti insegna come usare e personalizzare le funzionalità integrate di Roblox per strutturare ogni round, tra cui la guida dello scripting su:
- Inizia una partita reimpostando i punti individuali e del team, quindi generando i giocatori nelle loro aree di spawn del team.
- Personalizzare le variabili che impostano l'obiettivo per il round nella parte superiore dello schermo di ciascun Giocatore.
- Tracciare le contribuzioni del punto del giocatore per il loro punteggio di squadra.
- Attivazione di schermate UI uniche a seconda se la squadra del Giocatoreha vinto o perso la partita.
- Dalla fine di un round disconnettendo i giocatori e generandoli nella lobby neutral.
Dopo aver completato questa sezione, imparerai a implementare il comportamento del blaster che è sia preciso che soddisfacente per i giocatori.
Inizia Loop
ServerScriptService > Gameplay > Rounds gestisce la maggior parte della logica per l'implementazione dei round, e inizia chiamando la funzione
Punti
function Scoring.resetScores()
for _, player in Players:GetPlayers() do
player.leaderstats.Points.Value = 0
end
for _, team in Teams:GetTeams() do
team:SetAttribute(GuiAttribute.teamPoints, 0)
end
end
Ora che tutti stanno iniziando con punti zero,
Per i giocatori che sono attualmente nella lobby, startRoundLoopAsync() passa tutti i giocatori attualmente all'interno dell'esperienza alla funzione spawnPlayersInMap in ServerScriptService > 1> Gameplay1> > 4> Rounds4> > 7> spawnPlayersInMap7> per ordinare e bilanciare
For any new players that join the experience after the lobby group was sorts into a team, startRoundLoopAsync() listens for the Players.PlayerAdded:Connect event, then calls the spawnPlayersInMap function again to add them to the Tutorialewith the least amount of players. For more information on this
Round
-- Genera tutti i giocatori nella mappa
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- Genera nuovi giocatori nella mappa quando si uniscono
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
Imposta obiettivo
Ora che ciascun giocatore è nell'arena con i suoi compagni di squadra, l'esperienza deve fornire istruzioni su cosa fare per avere successo durante la partita. L'esperienza di tag laser di esempio affronta questo requisito fornendo un'impostazione obiettiva nella parte superiore dello schermo di ciascun Giocatorecon istruzioni chiare su ciò che il team deve fare per vincere.
Mentre puoi saperne di più su come configurare e visualizzare il Obiettivo UI component nel UI Curriculum, questa sezione si concentra su come implementare l'obiettivo obiettivo come il round inizia, iniziando con come impostare la quantità di punti che ogni team deve completare il round.
Anche se l'invito obiettivo in tempo esecuzione informa i giocatori che devono segnare tre punti per vincere, se esami l'invito in StarterGui > HUDGui , puoi vedere che invece contiene un configurabile " %d " per il valore del punto.
" %d " è una stringa di placeholder che puoi aumentare o diminuire in qualsiasi momento per soddisfare i tuoi requisiti di gioco aggiornando la variabile TEAM_SCORE_LIMIT in ReplicatedStorage > 1> TEAM_SCORE_LIMIT1> . Ad esempio, se impostassi questo numero su
LIMITAZIONE DEL PUNTEGGIO DELLA SQUADRA
local TEAM_SCORE_LIMIT = 200 -- nuova linea, assicurati di cambiare indietroreturn TEAM_SCORE_LIMIT
Questo semplice aggiornamento variabile funziona in tempo di esecuzione poiché, ReplicatedStorage > HUDGuiSetup > SetObjective richiede lo script del modulo 2> TEAM_SCORE_LIMIT2> in modo che possa scambiare la stringa di placeholder nell'oggetto 5>Class.TextLabel5> dell'interfaccia utente.
LIMITAZIONE DEL PUNTEGGIO DELLA SQUADRA
local TEAM_SCORE_LIMIT = require(ReplicatedStorage.TEAM_SCORE_LIMIT)
local function setObjective(gui: ScreenGui)
local bodyTextLabel = gui.Objective.ObjectiveDisplay.Body.BodyTextLabel
bodyTextLabel.Text = bodyTextLabel.Text:format(TEAM_SCORE_LIMIT)
end
Punti traccia
Ora che i giocatori hanno un obiettivo per il round, l'esperienza deve tenere traccia di ogni punto del team fino a quando non raggiungono il loro obiettivo. Mentre il comportamento predefinito del servizio Teams registra automaticamente ciascun Giocatoresotto il loro team e aggiunge ogni contribuzione del giocatore alla loro puntazione di team, è importante
Per assicurare che questo non accada e ogni contribuzione verso l'obiettivo del team sia preservata, ReplicatedStorage > HUDGuiSetup > StartSyncingTeamPoints memorizza tutti i punt
Quando localizza TeamACount e TeamBCount , ottiene il loro attributo teamColor, che si basa sulla zona di spawn della squadra: TeamACCount mostra i punti della squadra verde e TeamBCount traccia i punti della squadra rosa.
Inizia a sincronizzare i punti squadra
local function startSyncingTeamPoints(gui: ScreenGui)
for _, teamPointCounter in gui.Objective.TeamPointCounter:GetChildren() do
if not teamPointCounter:IsA("GuiObject") then
continue
end
local iconTeamColor = teamPointCounter:GetAttribute(GuiAttribute.teamColor)
Il script del modulo chiama quindi la sua funzione getTeamFromTeamColor per validare che l'attributo teamColor del TeamACount e l'attributo teamColor del TeamBCount corrispondono alle rispettive proprietà 2>Class.Team.Color2> sotto
Inizia a sincronizzare i punti squadra
local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end
Quando ciò si verifica, startSyncingTeamPoints imposta entrambi gli oggetti dei contatori del team TextLabel all'evento corrispondente teamPoints e continua ad aggiornarli ogni volta che un giocatore segna un punto facendo clic su un altro giocatore sul team opposto.
Inizia a sincronizzare i punti squadra
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
Tutto in questa sezione finora si è concentrato su come tracciare i punti sullo schermo del Giocatore, ma è importante rivedere la logica che gestisce i punti di tracciamento sul server in modo che sappia quando una squadra raggiunge l'obiettivo e vince la partita. Se rivedi ServerScriptService > Gameplay > Scoring , puoi vedere che lo script del mod
Punti
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
Chiama poi la funzione incrementScore, che esegue le seguenti azioni:
- Prende il punteggio individuale del Giocatoresulla Classificae aggiunge uno.
- Fa si che l'evento precedentemente menzionato con sia il team del Giocatoreche il loro punteggio.
Questo processo mantiene effettivamente sia il client che il server allineati riguardo sia i punteggi individuali dei giocatori che i punteggi del loro team.
Punti
function Scoring.incrementScore(player: Player, amount: number)
local team = player.Team
assert(team, `Player {player.Name} must be on a team to score a point, but has no team`)
local teamPoints = team:GetAttribute(GuiAttribute.teamPoints)
teamPoints += amount
team:SetAttribute(GuiAttribute.teamPoints, teamPoints)
local leaderstat = player.leaderstats.Points
leaderstat.Value += amount
teamScoreChangedBindable:Fire(team, teamPoints)
end
Visualizza risultati
Mentre i giocatori taggeranno gli altri e segneranno punti per la loro squadra, ServerScriptService > Gameplay > Rounds controlla se la squadra che ha segnato ha raggiunto l'obiettivo della partita. Se il loro team segna inferiore al 1> TEAM_SCORE_LIMIT</
Tuttavia, una volta che il punteggio di una squadra raggiunge la variabile TEAM_SCORE_LIMIT, lo script attiva un'istanza evento roundWinnerRemote con il nome del Giocatoree il suo team.
Round
-- Controlla se la partita è finita dopo ogni punteggiolocal team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- Mostra la teamvincitorefor _, player in Players:GetPlayers() do-- Invio di quale squadra il giocatore è alla fine della partita-- perché la squadra del giocatoreè in procinto di essere rimossa, quindi il client-- non sarà in grado di controllare la propria teamroundWinnerRemote:FireClient(player, team, player.Team)end
Lo script ReplicatedStorage > RoundResultsGuiSetup su ogni client ascolta questo evento roundWinnerRemote per poter:
- Mostra un unico StarterGui > RoundResultsGui schermo UI che annuncia i risultati del round e se il giocatore era sulla teamvincente.
- Riproduci un brano audio di vittoria o sconfitta.
Ad esempio, se un giocatore è sulla squadra che ha segnato il punto vincente, riceve più forme di feedback sulle risorse della round in forma di schermo UI che mostra il testo di vittoria e un clip audio che riproduce un suono gioioso. Invece, se un giocatore non è sulla squadra che ha segnato il punto vincente, riceve uno schermo UI che mostra il testo di sconfitta e un clip audio che riproduce un suono ominoso.
RoundResultsGuiImpostazioni
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- Se la nostra squadra ha vinto, mostreremo la Vittoria! Altrimenti mostreremo la Sconfitta...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end
Ripristina le squadre
Allo stesso tempo che ServerScriptService > Gameplay > Rounds verifica che una squadra abbia raggiunto l'obiettivo del round e attiva la visualizzazione UI appropriata per ciascun Giocatore, trasporta anche tutti i giocatori dall'arena alla lobby disconectandoli dal round. Questo inizia il processo di fine del round e ripristina entrambe le squadre.
Usando la stessa logica in Configura le posizioni di spawn, Rounds e poi imposta la posizione di spawn del Neutral nella lobby's 1> Class.SpawnLocation.Neutral|Neutral1> proprietà per 4> vero4> in modo che i giocatori possano spawnare lì indipendentemente dal loro Statodi team. Ciò signific
Round
-- Invia tutti nella lobbyplayerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
Dopo aver aspettato dieci secondi per un intervallo, lo script del server Rounds inizia il ciclo di nuovo facendo resetta le score di tutti e li classifica in nuove squadre. L'esempio ripetisce questo processo di round ciclico fino a quando non ci sono giocatori all'interno del Server.
Ora che i giocatori possono spawnare nella mappa con la propria squadra e giocare un round completo, la prossima sezione ti insegna gli script dietro il comportamento di ciascun blaster.