Dodaj rundy

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Dodawanie rund pozwala strukturyzować rozgrywkę w fazach z jasnym punktem początkowym i końcowym, dzięki czemu gracze mogą mierzyć swój postęp i mają okazję cykliczną do równych warunków gry.Jest to szczególnie ważne w przypadku gry opartej na drużynie, ponieważ oferuje graczom możliwość przełączenia ich stylu gry w zależności od tego, kto jest w ich drużynie podczas tej rundy.

Używając doświadczenia laserowego taga próbnego jako odniesienia, sekcja tego samouczka nauczy Cię, jak korzystać i dostosowywać wbudowane funkcje Roblox, aby strukturyzować każdą rundę, w tym wskazówki dotyczące programowania:

  • Rozpoczęcie rundy poprzez zresetowanie pojedynczych punktów i punktów drużyny, a następnie wygenerowanie graczy w strefach odrodzenia drużyny.
  • Dostosowywanie zmiennych, które ustawiają cel rundy na górze ekranu każdego gracza.
  • Śledzenie wkładów punktów gracza do wyniku drużyny.
  • Wyzwalanie unikalnych ekranów interfejsu użytkownika w zależności od tego, czy drużyna gracza wygrała lub przegrała rundę.
  • Zakończenie rundy poprzez odłączenie graczy i umieszczenie ich w neutralnym lobby.

Po zakończeniu tej sekcji nauczysz się, jak wdrożyć zachowanie blastera, które jest dokładne i zadowalające dla graczy.

Zacznij pętlię

ServerScriptService > Rozgrywka > Rundy > obsługuje większość logiki do wdrażania rund, a zaczyna się od wezwania funkcji startRoundLoopAsync() w celu oznaczenia początku pętla rundy.Podczas gdy gracze dołączają do lobby i czekają na sortowanie do zespołu, > wezwuje funkcję > Gry > Punktów drużyny >, aby zresetować zarówno tabelę liderów, jak i punkty drużyny.

Ocena

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 punktów zerowych, następnie ustawia właściwość Neutral lokalizacji spawnowania na fałsz tak, że tylko gracze z tym samym właściwością jak lokalizacja spawnu mogą się tam pojawić.Ponieważ właściwość spawn location's TeamColor jest ustawiona na białe zamiast zespołów mięty lub karnacji różowych próbki, ta konfiguracja uniemożliwia wszystkim graczom wygenerowanie lub odrodzenie tam, gdy runda jest aktywna.

Dla graczy, którzy są obecnie w lobby, startRoundLoopAsync() przepustki wszystkich graczy obecnie w doświadczeniu przekazują do funkcji spawnPlayersInMap w ServerScriptService > Gameplay > rundy > spawnPlayersInMap do sortowania i równoważenia wszystkich w drużynie z około taką samą liczbą graczy.

Dla każdego nowego gracza, który dołącza do doświadczenia po tym, jak grupa lobby została sklasyfikowana w zespół, startRoundLoopAsync() słucha wydarzenia Players.PlayerAdded:Connect, a następnie ponownie dzwoni funkcję spawnPlayersInMap, aby dodać ich do zespołu z najmniejszą ilością graczy.Aby uzyskać więcej informacji o tym procesie, zobacz Konfiguruj lokalizacje pojawienia z poprzedniej sekcji Spawanie i odrodzenie samouczka.

Rundy

-- Wygeneruj wszystkich graczy na mapie
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- Wygeneruj 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 ze swoimi kolegami z drużyny, doświadczenie musi zapewnić instrukcje, co zrobić, aby odnieść sukces w rundzie.Próbne doświadczenie z tagiem laserowym radzi sobie z tym wymogiem, zapewniając obiektywny komunikat na górze ekranu każdego gracza z wyraźnymi wskazówkami, co drużyna musi zrobić, aby wygrać.

Chociaż możesz dowiedzieć się więcej o tym, jak skonfigurować i wyświetlać komponent Celowa interfejs użytkownika w menu UI, ten rozdział skupia się na tym, jak wdrożyć celowy cel, gdy rozpoczyna się runda, zaczynając od tego, jak ustawić ilość punktów, których każda drużyna potrzebuje, aby ukończyć rundę.

Chociaż celowe okienko podczas uruchamiania informuje graczy, że muszą zdobyć trzy punkty, aby wygrać, jeśli przeanalizujesz okienko w StarterGui > HUDGui , możesz zobaczyć, że zawiera ono zamiast tego konfigurowalną wartość punktów.

„” to pusty ciąg znaków, który możesz zwiększyć lub zmniejszyć w dowolnym momencie, aby spełnić własne wymagania dotyczące rozgrywki, aktualizując zmienną ” w ReplicatedStorage > TEAM_SCORE_LIMIT.Na przykład, jeśli ustawisz tę liczbę na zbyt wysoką 200, punkt kontrolny i drużyny zostaną odpowiednio zaktualizowane.

Ograniczenie wyniku zespołu TEAM_SCORE_LIMIT

local TEAM_SCORE_LIMIT = 200 -- aktualizowana linia, upewnij się, że zmienisz wsteczz powrotem
return TEAM_SCORE_LIMIT

Ta prosta aktualizacja zmiennej działa w czasie wykonania, ponieważ gdy rozpoczyna się runda, ReplicatedStorage > HUDGuiSetup > Ustaw cel wymaga skryptu modułu , aby mógł zamienić ciąg znaków miejsceholder w obiekcie celu UI.

Ograniczenie wyniku zespołu 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

Punkty śledzenia

Teraz, gdy gracze mają cel na rundę, doświadczenie musi śledzić punkty każdej drużyny, dopóki nie osiągną celu.Chociaż domyślne zachowanie usługi Teams automatycznie grupuje każdego gracza pod jego drużyną i dodaje każdy wkład gracza do jego wyniku drużyny, ważne jest przechowywanie i monitorowanie punktów w odrębnej lokalizacji dla gry opartej na rundach, ponieważ jeśli gracz zdobędzie wynik, wyjdzie z gry, zanim runda się skończy, jego wkład zostanie odliczony od tabeli wyników, gdy odłączy się od doświadczenia.

Aby upewnić się, że nie dojdzie do tego i że każdy wkład w cel zespołu zostanie zachowany, ReplicatedStorage > HUDGuiSetup > Rozpoczęcie synchronizacji punktów zespołu przechowuje wszystkie punkty osobno za pomocą atrybutu w usłudze.Jako teamPoints wzrostów, ten skrypt modułu wzywa funkcję startSyncingTeamPoints , aby znaleźć licznik zespołu Class.GuiObjects w komponencie interfejsu celowego.

Gdy znajdzie licznik zespołów i licznik zespołów, otrzymuje ich atrybut , który koreluje z strefami spawnowania zespołów: TeamACounter wyświetla punkty zielonego zespołu, a TeamBCounter śledzi punkty różowego zespołu.

Rozpocznij zsynchronizowanie punktów zespołu

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)

Skrypt modułu następnie wywołuje swoją funkcję w celu zweryfikowania, że atrybut TeamACounter's mint oraz TeamBCounter's carnation pink spełniają odpowiednie właściwości pod spodem usługi.Jeśli tak, zwraca obie drużyny.

Rozpocznij zsynchronizowanie punktów zespołu

local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end

Kiedy to wystąpi, ustawia obiekty zliczarki zespołów obu stron na ich odpowiednie wartości, a następnie nadal je aktualizuje za każdym razem, gdy gracz zdobywa punkt poprzez oznaczenie innego gracza z przeciwnej drużyny.

Rozpocznij zsynchronizowanie punktów zespołu

teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)

Wszystko w tej sekcji skupiło się dotąd na tym, jak śledzić punkty na ekranie gracza, ale ważne jest przejrzenie logiki, która obsługuje punkty śledzenia na serwerze, aby wiedziała, kiedy drużyna osiągnie celowy cel i wygra rundę.Jeśli ponownie odwiedzisz ServerScriptService > Grę > Skorowanie , możesz zobaczyć, że skrypt modułu rozpoczyna się przez utworzenie wiązanego wydarzenia, które będzie wystrzeliwane za każdym razem, gdy gracz zdobędzie punkt.

Ocena

local teamScoreChangedBindable = Instance.new("BindableEvent")
local Scoring = {
teamScoreChanged = teamScoreChangedBindable.Event,
}

Następnie wywołuje funkcję incrementScore, która wykonuje następujące działania:

  • Chwyta zespół gracza i jego obecną wartość punktów zespołu na obiekcie Team w usłudze Teams, a następnie dodaje jeden.
  • Chwyta indywidualny wynik gracza na rankingwyników i dodaje jeden.
  • Wysyła wcześniej wspomniane wiązane wydarzenie z zespołem gracza i jego wynikiem.

Proces ten skutecznie utrzymuje zarówno klienta, jak i serwer zgodny w odniesieniu do indywidualnych wyników graczy oraz wyników ich drużyn.

Ocena

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świetl wyniki

Gdy gracze oznaczają siebie nawzajem i zdobywają punkty dla swojej drużyny, ServerScriptService > Gameplay > Rundy sprawdza, czy drużyna, która zdobyła punkty, spełniła cel rundy.Jeśli wynik ich drużyny jest niższy niż zmienna TEAM_SCORE_LIMIT w ReplicatedStorage > TEAM_SCORE_LIMIT , serwer nadal czeka, aż jedna z drużyn ponownie zdobędzie wynik.

Jednak gdy wynik zespołu osiągnie zmienną TEAM_SCORE_LIMIT, skrypt uruchamia instancję wydarzenia roundWinnerRemote z nazwą gracza i jego drużyną.

Rundy

-- Sprawdź, czy runda zakończyła się po każdym wyniku
local team: Team
local score: number = 0
while score < TEAM_SCORE_LIMIT do
team, score = Scoring.teamScoreChanged:Wait()
end
-- Wyświetl zwycięską drużynę
for _, player in Players:GetPlayers() do
-- Wysyłanie, z jakiego zespołu gracz jest na końcu rundy
-- ponieważ drużyna gracza ma zostać usunięta, więc klient
-- nie będzie mógł sprawdzić własnego zespołu
roundWinnerRemote:FireClient(player, team, player.Team)
end

Skrypt ReplicatedStorage > RoundResultsGuiSetup na każdej liście klientów słucha tego zdarzenia roundWinnerRemote tak, aby mógł:

  • Wyświetl unikalny ekran interfejsu użytkownika StarterGui , > RoundResultsGui , który ogłasza wyniki rundy i czy gracz był w drużynie zwycięskiej.
  • Odtwórz wygrany lub przegrany klip audio.

Na przykład, jeśli gracz jest w drużynie, która zdobyła punkt zwycięski, otrzymuje wiele form opinii na temat wyników rundy w formie ekranu interfejsu użytkownika, który wyświetla tekst zwycięstwa, i pliku audio, który odtwarza radosny dźwięk.Odwrotnie, jeśli gracz nie jest w drużynie, która zdobyła punkt zwycięski, otrzymuje ekran interfejsu użytkownika, który wyświetla tekst przegrany, oraz plik audio, który odtwarza niepokojący dźwięk.

Opinia zwrotna o zwycięstwie
Pokonaj opinię zwrotną
Ustawienie RoundResultsGui

local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- Jeśli nasza drużyna wygra, pokażemy Zwycięstwo! W przeciwnym razie pokażemy 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, gdy ServerScriptService > Gameplay > Rounds sprawdza, czy drużyna spełniła cel rundy i uruchamia odpowiedni wygląd interfejsu dla każdego gracza, przenosi również wszystkich graczy z areny do lobby, odłączając ich od rundy.To rozpoczyna proces formalnego zakończenia rundy i zresetowania obu drużyn.

Używając tej samej logiki w Konfiguruj lokalizacje pojawienia , Rounds następnie ustawia właściwość Neutral lokalizacji pojawienia na prawdę , tak że gracze mogą się tam pojawić niezależnie od ich statusu zespołu.Oznacza to, że lobby staje się jedynym miejscem, w którym gracze mogą się pojawić po odłączeniu od rundy.

Rundy

-- Wyślij wszystkich do lobby
playerAddedConnection:Disconnect()
neutralSpawn.Neutral = true
spawnPlayersInLobby(Players:GetPlayers())

Po czekaniu dziesięciu sekund na przerwę, skrypt serwera rund rozpoczyna pętelę ponownie, zmieniając wyniki wszystkich i sortując je w nowe drużyny.Próbka powtarza ten cykliczny proces rundy ponownie, dopóki nie ma żadnych graczy na serwerze.

Teraz, gdy gracze mogą pojawiać się na mapie ze własnym zespołem i grać w pełną rundę, następna sekcja uczy Cię o skryptach za zachowaniem każdego blastera.