Dodawanie rund pozwala na strukturę gry w fazach z wyraźnym początkiem i końcem, aby gracze mogli zmierzyć swoje postępy i mieć okazję na równiutkim polu gry. Jest to szczególnie ważne dla gry opartej na zespołach, ponieważ oferuje graczom szansę zmiany swego stylu gry w zależności od tego, kto jest na ich zespole podczas tego rundy.
Używając do referencji 示例 laser tag experience, ta sekcja tutorialu nauczy cię, jak używać i dostosowywać zbudowane funkcje Roblox do każdej rundy, w tym kierunki skryptów na:
- Rozpoczynanie rundy poprzez zresetowanie pojedynczych i zespołych punktów, a następnie powodzenie graczy do ich strefach powstawania zespołu.
- Dostosowywanie zmiennej ustawiającej cel w każdym graczu.
- Śledzenie wkładów punktów gracza do ich wyniku zespołu.
- Pokazywanie unikalnych ekranów UI w zależności od tego, czy zespół gracza wygrał lub przegrał rundę.
- Zakończenie rundy poprzez odłączenie graczy i umieszczenie ich w neutralnej poczekalni.
Po zakończeniu tej sekcji dowiesz się, jak zaimplementować zachowanie blastera, które jest zarówno dokładne, jak i satysfakcjonujące dla graczy.
Zacznij pętę
ServerScriptService > Gameplay > Rounds > 0> Call the 0> startRoundLoopAsync() 0> function to mark the beginning of a round loop. While
Wynikowanie
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
Teraz, gdy wszyscy zaczynają od zero,
Dla graczy, którzy są obecnie w lobby, startRoundLoopAsync() przesyła wszystkich graczy obecnie w doświadczeniu do funkcji spawnPlayersInMap w ServerScriptService > 1>Gry1> > 4>Rounds4> > 7>spawnPlayersInMap</
Dla każdych nowych graczy, którzy doświadczenie połączą się z grupą lobby, słucha startRoundLoopAsync() listy na wydarzenie Players.PlayerAdded:Connect, a następnie wzywa funkcję spawnPlayersInMap, aby
Rundy
-- Wygeneruj wszystkich graczy na mapie
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- Wy生成uj nowych graczy na mapie, gdy dołączą
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
Ustaw cel
Teraz, gdy każdy gracz jest na arenie z członkami swojej drużyny, doświadczenie musi zapewnić instrukcje, co należy zrobić, aby odnieść sukces w rundzie. Sam przykładowy tag laserowy doświadczenie podejmuje ten wymóg, zapewniając celny prom示 na górze każdego gracza z wyraźnym przewodnikiem na temat tego, co zespół musi zrobić, aby wygrać.
Podczas gdy można dowiedzieć się więcej o tym, jak skonfigurować i wyświetlić komponent Celowa interfejs użytkownika w Curriculum UI, ta sekcja koncentruje się na tym, jak zaimplementować celową celę, zaczynając od tego, jak ustawić ilość punktów, która każda drużyna musi ukończyć rundę.
Mimo że celowe wskazówki podczas uruchomienia informują graczy, że muszą zdobyć trzy punkty, aby wygrać, jeśli zbadałeś wskazówkę w StarterGui > HUDGui , możesz zobaczyć, że zawiera zamiast tego konfigurowalne " %d " dla wartości punktu.
„%d%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam
LIMIT WYSTĘPU TEAM_SCORE
local TEAM_SCORE_LIMIT = 200 -- aktualizowana linia, upewnij się, że zmieniłeś wsteczreturn TEAM_SCORE_LIMIT
Ta prosta aktualizacja zmiennej działa na czasie uruchomienia, ponieważ wraz z początkiem rundy ReplicatedStorage > HUDGuiSetup > SetObjective > 2>UstawGodzinę2> wymaga skryptu modułu 5> TEAM_SCORE_LIMIT5>, aby mógł zamienić zmienną strunę w obiektywie celu
LIMIT WYSTĘPU TEAM_SCORE
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
Punkty śledzenia
Teraz, gdy gracze mają cel dla rundy, doświadczenie musi śledzić każdą drużynę, aby uzyskać ich cel, aż osiągną go. Podczas gdy automatyczne zachowanie usługi Teams grupuje każdego gracza pod swoim zespołem i doduje każdy wkład każdego
Aby upewnić się, że nie dojdzie do tego i każdy wkład w kierunku celu zespołu zachowany, ReplicatedStorage > HUDGuiSetup > StartSyncingTeamPoints</
Gdy lokalizuje TeamACount i TeamBCount, otrzymuje ich atrybut teamColor, który koreluje się z obszarami spawnu zespołu: TeamACCounter wyświetla punkty zespołu zielonego, a TeamBCCounter śledzi punkty zespołu różowego.
PoczątekSynchronizacjiDrużyny
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)
Następnie modułowy skrypt wzywa jego funkcję getTeamFromTeamColor, aby potwierdzić, że atrybut teamColor TeamACounters' jest zgodny z odpowiednim właściwością teamColor podczas gdy właściwość 2>
PoczątekSynchronizacjiDrużyny
local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end
Gdy to się zdarza, startSyncingTeamPoints ustawia obie obiekty liczników zespołu TextLabel na ich odpowiednie wartości teamPoints i nadal je aktualizuje, gdy gracz zdobądź punkt przez oznaczenie innego gracza na polu przeciwnego zespołu.
PoczątekSynchronizacjiDrużyny
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
Wszystko w tej sekcji do tej pory skupiło się na tym, jak śledzić punkty na ekranie gracza, ale ważne jest, aby przeglądać logikę, która obsługuje śledzenie punktów na serwerze, aby wiedzieć, kiedy zespół osiągnie cel i wygra rundę. Jeśli ponownie odwiedzisz ServerScriptService >
Wynikowanie
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
Następnie wzywa funkcję incrementScore, która wykonuje następujące działania:
- Zdobądź indywidualny wynik gracza na tabeli rankingi dodaj go.
- Wykonuje wcześniej wspomniane wiążące wydarzenie z zespołem gracza i ich wynikiem.
Ten proces utrzymuje skutecznie zarówno klienta, jak i serwera w odniesieniu do wyników poszczególnych graczy i ich wyników zespołu.
Wynikowanie
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
Wyświetuj wyniki
Gdy gracze oznaczają się nawzajem i zdobywają punkty dla swojego zespołu, ServerScriptService > Gameplay > Rounds sprawdza, czy zespół, który zdobył runda, osiągnął cel runden. Jeśli ich zespół zdobył niższy wynik
Jednak po osiągnięciu przez zespół wyniku TEAM_SCORE_LIMIT zmienne, skrypt wysyła instancję więc roundWinnerRemote z imieniem gracza i jego zespołu.
Rundy
-- Sprawdź, czy rundy się zakończyły po każdym wynikulocal team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- Pokazujące drużyny zwycięskiefor _, player in Players:GetPlayers() do-- Wysyłanie zespołu, na którym gracz jest na końcu rundy-- bo zespół gracza zostanie usunięty, więc kliент-- nie będzie w stanie sprawdzić własnej drużynyroundWinnerRemote:FireClient(player, team, player.Team)end
Skrypt ReplicatedStorage > RoundResultsGuiSetup na każdym liście klientów słucha tego roundWinnerRemote wydarzenia, aby może:
- Pokaż unikalny StarterGui > RoundResultsGui ekran UI, który ogłasza wyniki rundy i czy gracz był na zwycięskiej drużynie.
- Odtwarzaj nagrania zwycięstwa lub porażki.
Na przykład, jeśli gracz jest w drużynie, która zdobyła punkt wygranej, otrzymuje wiele formy zwrotów na temat wyników rundy w formie ekranu UI, który wyświetla tekst zwycięstwa, i zapis audio, który odtwarza dźwięk zabawy. Z drugiej strony, jeśli gracz nie jest w drużynie, która zdobyła punkt wygranej, otrzymuje ekran UI, który wyświetla tekst zwyci
RoundResultsGuiUstawienia
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- Jeśli nasza drużyna wygrała, wyświetlimy zwycięstwo! W przeciwnym razie wyświetlimy porażkę ...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end
Zresetuj zespoły
W tym samym czasie, że ServerScriptService > Gameplay > Rounds > 1> Rounds dla każdego gracza1> z weryfikuje, że zespół osiągnął cel rundy i wyświetla odpowiedni interfejs użytkownika dla każdego gracza, rozpoczyna również proces oficjalnego zakończenia rundy i resetu obu zespołów. To rozpoczyna proces
Używając tej samej logiki w Konfiguruj lokalizacje spawn, Rounds i następnie ustawia Neutral lokalizację spawn'u, aby 1>Class.SpawnLocation.Neutral|Neutral1> właściwość 4>tak4>, aby gracze mogli spawnować tam, niezale
Rundy
-- Wyślij wszystkich do lobbyplayerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
Po czekaniu dziesięciu sekund na przerwę, Rounds serwer skryptu zaczyna się wtedy ponownie cykl ponownie poprzez zresetowanie wyników wszystkich i sortowanie ich w nowe zespoły. Przykład powtarza ten cykliczny proces runda, aż nie ma graczy w serwerze.
Teraz, gdy gracze mogą wy生ić na mapie ze swoim własnym zespołem i zagrać pełen rundy, następny sekcja uczy cię o skryptach za każdym z blasterów zachowania.