Runden hinzufügen ermöglicht es dir, das Gameplay in Phasen mit einem klaren Start und einem Ziel zu strukturieren, damit Spieler ihre Fortschritte messen und eine regelmäßige Gelegenheit für ein gleichberechtigtes Spielen haben können. Dies ist besonders wichtig für Team-basiertes Gameplay, da es den Spielern die Chance bietet, ihre Spielweise während dieser Runde zu ändern, abhängig davon, wer in ihrem Team während dieser Runde ist.
Dieser Teil des Tutorials verwendet die Projekt-Laser-Tag-Erfahrung als Referenz, in der dieser Abschnitt die folgenden Roblox-Funktionen erläutert, die Sie verwenden können, um jede Runde zu strukturieren, einschließlich der Skript-Steuerung auf:
- Beginnen Sie eine Runde, indem Sie einzelne und teamliche Punkte zurücksetzen und Spieler dann zu ihren Team-Spawn-Zonen spawnen.
- Anpassung von Variablen, die das Ziel für die Runde oben auf dem Bildschirm eines jeden Spieler:infestlegen.
- Verfolgen Sie die Beiträge des Spielers für seine Team-Punktzahl.
- Auslösen von einzigartigen Benutzeroberflächen, abhängig davon, ob das Team des Spieler:indie Runde gewinnt oder verliert.
- Ende einer Runde, indem du Spieler trennst und sie in der neutralen Lobby spawnest.
Nachdem Sie diesen Abschnitt abgeschlossen haben, werden Sie lernen, wie Sie Blaster-Verhalten implementieren, das sowohl akkurat als auch beeindruckend ist.
Loop starten
ServerScriptService > Gameplay > Rounds > 0> startRoundLoopAsync()0> nennt die Anfangspunkte für die Ein
Score
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
Da jetzt alle mit null Punkten beginnen, startRoundLoopAsync
Für Spieler, die derzeit in der Lobby sind, startRoundLoopAsync() passt alle Spieler derzeit innerhalb der Erfahrung an die spawnPlayersInMap -Funktion in ServerScriptService > 1> Gameplay1> > 4> Runden4> > 7> spawnPlayersInMap7> zu sortieren und ausz
Für alle neuen Spieler, die dem Erlebnis nach der Lobby-Gruppe beitreten, sortiert in ein Team, startRoundLoopAsync() listens für das Ereignis Players.PlayerAdded:Connect und ruft dann die spawnPlayersInMap -Funktion erneut auf, um sie dem Team
Runden
-- Alle Spieler auf der Karte spawnen
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- Spawne neue Spieler auf der Karte, wenn sie beitreten
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
Ziel einstellen
Jetzt, da jedem Spieler in der Arena mit seinen Teamkollegen ist, muss die Erfahrung Anweisungen geben, was getan werden muss, um in der Runde erfolgreich zu sein. Die Beispiel-Laser-Tag-Erfahrung greift diesen Anforderungswerkstieg mit einer klaren Anweisung an der Spitze jedes Spieler:inauf dem Bildschirm mit klarer Anleitung, was das Team tun muss, um zu gewinnen.
Während Sie mehr darüber erfahren können, wie Sie die Ziel-UI -Komponente im UI-Curriculum konfigurieren und anzeigen, konzentriert sich diese Sektion auf die Umsetzung des Zielziels, während die Runde beginnt, indem Sie beginnen, wie Sie die Menge an Punkten setzen, die jedes Team für die Runde zu vervollständigen.
Obwohl die Zielanfrage zur Laufzeit den Spielern sagt, dass sie drei Punkte erzielen müssen, um zu gewinnen, wenn Sie die Anfrage in StarterGui > HUDGui untersuchen, können Sie sehen, dass sie stattdessen eine konfigurierbare " %d" für den Punktewert enthält.
„%d“ ist eine Platzhalterzeile, die Sie jederzeit erhöhen oder ändern können, um Ihre eigenen Spielanforderungen zu erfüllen, indem Sie die Variable %d in TEAM_SCORE_LIMIT > TEAM_SCORE_LIMIT aufrufen. Zum Beispiel, wenn Sie diese Zahl auf einen übermäßig
TEAM_SCORE_LIMIT
local TEAM_SCORE_LIMIT = 200 -- aktualisierte zeile, stellen sie sicher, dass sie zurückändernreturn TEAM_SCORE_LIMIT
Diese einfache Variable-Update funktioniert auf der Laufzeit, da der Round beginnt, ReplicatedStorage > HUDGuiSetup > SetObjective erfordert das 1> TEAM_SCORE_LIMIT1>-Modul-Skript, damit es die Platzhalter-Strung im UI-Objekt 4> Class.TextLabel4> tauschen kann.
TEAM_SCORE_LIMIT
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
Schienenpunkte
Jetzt, da die Spieler ein Ziel für die Runde haben, muss die Erlebnisdie Punkte jedes Teams verfolgen, bis sie ihr Ziel erreicht haben. Während das Standardverhalten von Teams die Standard-Beziehung zwischen jedem Spieler unter ihrem Team und addiert jeden Spieler:inzu ihrem Team-Score hinzu, ist es wichtig, Punkte in einem separaten Ort zu speichern und
Um dies zu verhindern, dass dies geschieht und jeder Beitrag zum Teamziel gespeichert wird, ReplicatedStorage > HUDGuiSetup > StartSyncingTeamPoints speichert alle Punkte separ
Wenn es TeamACounter und TeamBCount findet, erhält es ihren teamColor -Attribut, das mit den Team-Spawn-Zonen korreliert: TeamACounter zeigt die grünen Teampunkte an, und TeamBCount verfolgt die rosa Teampunkte.
StartSyncingTeamPunkte
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)
Dann ruft das Modulskript seine Funktion getTeamFromTeamColor, um zu überprüfen, dass das AttributTeamACounters mintteamColor des Teams und das AttributTeamBCounters 2> carnation pink2> 5> teamColor
StartSyncingTeamPunkte
local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end
Wenn dies geschieht, setzt startSyncingTeamPoints sowohl die Objekte der jeweiligen Teamzähler auf ihre entsprechenden TextLabel -Werte und aktualisiert sie, wenn ein Spieler einen Punkt durch das Markieren eines anderen Spielers auf dem anderen Team erzielt.
StartSyncingTeamPunkte
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
Alles in diesem Abschnitt bisher hat sich auf die Art und Weise konzentriert, wie man Punkte auf dem Bildschirm des Spieler:inverfolgt, aber es ist wichtig, die Logik zu überprüfen, die die Verfolgungspunkte auf dem Server verwaltet, damit sie wissen, wann ein Team das Ziel erreicht und die Runde gewinnt. Wenn Sie ServerScriptService > Gameplay > Scoring
Score
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
Dann ruft die incrementScore Funktion auf, die die folgenden Aktionen ausführt:
- Schnappt sich die einzelne Punktzahl des Spieler:inauf der Bestenliste und fügt einen hinzu.
- Feuert das zuvor erwähnte baubare Ereignis mit dem Team des Spieler:inund seinem Ergebnis ab.
Dieser Prozess hält sowohl den Client als auch den Server in Bezug auf die einzelnen Ergebnisse und Team-Ergebnisse beider Spieler auf dem gleichen Niveau.
Score
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
Ergebnisse anzeigen
Wenn Spieler miteinander taggen und Punkte für ihr Team erzielen, ServerScriptService > Gameplay > Runden überprüft, um zu sehen, ob das Team, das die Rundenziele erreicht hat, den Rundenzielvorgaben erfüllt. Wenn ihr TeamScore niedriger als die 1>
Jedoch, sobald die Score-Bewertung eines Teams die TEAM_SCORE_LIMIT - Variable erreicht, wird ein roundWinnerRemote -Ereignis mit dem Namen des Spieler:inund seinem Team ausgelöst.
Runden
-- Überprüfen Sie, ob die Runde nach jedem Score beendet istlocal team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- Team anzeigen, das gewinntfor _, player in Players:GetPlayers() do-- Senden, auf welches Team der Spieler am Ende der Runde ist-- da das team des spieler:inkurz davor ist, entfernt zu werden, so dass der client-- wird nicht in der lage sein, sein eigenes team zu überprüfenroundWinnerRemote:FireClient(player, team, player.Team)end
Das ReplicatedStorage > RoundResultsGuiSetup Skript auf jedem Client hört auf diesen roundWinnerRemote -Ereignis-Instanz, damit es:
- Zeigen Sie eine einzigartige StarterGui > RoundResultsGui UI-Bildschirm, der die Rundenergebnisse und den Spieler im Teamankündigt.
- Spielen Sie ein Gewinn- oder Niederlagen-Audio.
Zum Beispiel, wenn ein Spieler auf dem Team ist, das den gewinnenden Punkt erzielte, erhält er mehrere Formen von Feedback auf die Rundengebote im Form eines UI-Bildschirms, der den Siegestext anzeigt, und eines Audio-Clips, der einen fröhlichen Ton spielt. Umgekehrt erhält ein Spieler, der nicht auf dem Team ist, das die gewinnende Runde erzielte, ein UI-Bildschirm, das den Siegestext anzeigt, und einen Audio-Clip, der einen fröhlichen Sound spielt.
RundeErgebnisseGuiEinstellungen
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- Wenn unser Team gewonnen hat, werden wir Sie bei einem Sieg anzeigen! Ansonsten anzeigen Sie Niederlage ...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end
Teams zurücksetzen
Gleichzeitig, dass ServerScriptService > Gameplay > Runden überprüft, dass ein Team die Rundenziele erfüllt und das entsprechende UI-Anzeige für jeden Spieler:inauslöst, transportiert auch alle Spieler von der Arena in die Lobby, indem sie sie vom Round abbinden. Dies beginnt den Prozess, die Runde offiziell zu beenden und beide Teams zurückzusetzen.
Wenn Sie die gleiche Logik in Konfigurieren von Spawn-Standorten, Runden und dann das Neutral -Spawn-Ort's 1> Class.SpawnLocation.Neutral|Neutral1>-Eigenschaft auf 4> wahr4> setzt, damit Spieler dort spawnen können, unabhängig von ihrem Team-
Runden
-- Alle in die Lobby sendenplayerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
Nachdem Sie zehn Sekunden auf eine Unterbrechung gewartet haben, startet der Rounds-Server-Skript dann den Loop erneut, indem alle Ergebnisse zurückgesetzt und in neue Teams sortiert werden. Die Probe wiederholt diesen zyklischen Prozess, bis keine Spieler innerhalb des Servers vorhanden sind.
Jetzt, da Spieler mit ihrem eigenen Team auf die Karte spawnen und eine vollständige Runde spielen können, erklärt die nächste Sektion die Skripte hinter dem Verhalten jedes Blasters.