Zakoduj pętlię gry

*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.

Po utworzeniu mapy nadszedł czas, aby rozpocząć budowę skryptów.Pozostała część tego kursu będzie mocno skupiona na skryptowaniu wszystkich różnych elementów pętli gry.

Ustaw skrypty

Bitwa royale wykorzysta kombinację skryptów modułowych i zwykłych skryptów. Poniżej są skrypty i ich funkcje.

Menadżer grySkrypt. Wykonuje funkcje z menedżera meczów za pomocą zmiennych z ustawień gry
Menadżer meczówSkrypt modułu. Wykonuje funkcje, takie jak wysyłanie graczy na arenę lub śledzenie czasu w dopasowywać.
Ustawienia grySkrypt modułu. Przechowuje powszechnie używane zmienne używane przez inne skrypty.

Skrypt ustawień gry

Stwórz skrypt modułu o nazwie GameSettings, aby przechować zmienne używane przez inne skrypty, takie jak czas meczu i przerwy.Te zmienne zostaną wykorzystane przez skrypt GameManager później.

  1. W ServerStorage , utwórz katalog o nazwie ModuleScripts. W tym katalogu utwórz nowy skrypt modułu o nazwie GameSettings.

  2. Otwórz ustawienia gry i zmień nazwę tabeli modułu, aby pasowała do nazwy skryptu.


    local GameSettings = {}
    return GameSettings
  3. W tabeli modułu dodaj zmienne do następującego użytku. Zrób najlepszą szacunkową dla każdej wartości, możesz ją zawsze zmienić później, gdy testujesz.

    • Czas przerwy - sekundy gracze czekają przed dopasowywać.
    • Czas trwania meczu - Długość meczu w sekundach.
    • Minimalna liczba graczy - Najmniejsza liczba graczy potrzebna do rozpoczynać.
    • Czas przejścia - Czas przed i po meczu w sekundach. Ułatwia przejście między częściami pętli gry mniej gwałtownie.

    local GameSettings = {}
    -- Zmienne gry
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

Skrypt Menadżera meczów

Drugi skrypt połączony z GameManagerem to MatchManager.Ten skrypt zarządza zadaniami, takimi jak uruchomienie timera lub zresetowanie graczy po zakończeniu meczu.

W ramach MatchManager istnieje funkcja o nazwie prepareGame(), która rozpoczyna grę, przenosząc graczy do dopasowywać.

  1. W ServerStorage > ModuleScripts > dodaj skrypt modułu o nazwie MatchManager. Zmień nazwę tabeli modułu.


    local MatchManager = {}
    return MatchManager
  2. Dodaj nową funkcję modułu do MatchManager o nazwie prepareGame(). Włącz oświadczenie o drukowaniu, aby później przetestować skrypt.


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

Zakoduj pętlię gry

Główny cykl gry zostanie skodowany w skrypcie GameManager za pomocą zmiennych właśnie utworzonych.Pamiętaj, że w pętlu gry występują trzy fazy: przerwa, konkurencja i oczyszczenie i resetować.

Skrypt Menadżera gry

Ten skrypt jest zwykłym skryptem serwera, więc umieść go w ServerScriptService, a nie w katalogu skryptów modułu.Rzeczywista pętla gry będzie w pętli while true.

  1. W ServerScriptService utwórz nowy skrypt o nazwie GameManager.

  2. Dodaj zmienną dla usługi "ServerStorage", która jest miejscem, w którym znajdują się Modulescripty.Następnie dodaj zmienną dla usługi "Gracze", która będzie potrzebna do sprawdzenia liczby graczy podczas przerw.


    -- Usługi
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Aby użyć wcześniej utworzonych modułów:

    • Ustaw zmienną o nazwie moduleScripts na lokalizację katalogu ModuleScripts.
    • Dodaj zmienne o nazwie matchManager i gameSettings. Ustaw każdą zmienną na wymaganie odpowiedniego skryptu.

    -- Usługi
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Skrypty modułowe
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
  4. Po zmiennych dodaj pętli while true do. Wszystkie fazy pętli gry zostaną w niej włączone, aby się powtarzały bez końca.


    -- Skrypty modułowe
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Główny cykl gry
    while true do
    end

Zakoduj przerwę

Choć pętla gry biegnie bez końca, przerwa powinna wstrzymać pętlę i kontynuować tylko wtedy, gdy jest wystarczająca liczba graczy na dopasowywać.Aby zrealizować tę przerwę, dodaj gniazdzony cykl powtórzenia dla przerwy w pędzie while.Ta zamknięta pętla powtórzy się, dopóki nie pojawi się wystarczająca liczba graczy, przerwując główną pętlę.Gdy pojawi się wystarczająca liczba graczy, wyjdzie i przeniesie graczy do dopasowywać.

Z powtórzeniem pętli , kod w pętli zostanie wykonany co najmniej raz.W przeciwieństwie do pętli while nie sprawdza ona swojego warunku, dopóki pętla się nie zakończy.Zapewnia to, że gracze zawsze idą do lobby przed dopasowywać.

  1. W pętli while true do wpisz repeat i naciśnij Enter, aby wypełnić automatycznie za pomocą kluczowa until.


    while true do
    repeat
    until
    end
  2. Sprawdź, czy aktualna liczba graczy (#Players:GetPlayers()) jest większa lub równa zmiennej minimumPlayers utworzonej wcześniej w module GameSettings.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. W pętlu powtórzenia dodaj oświadczenie drukujące mówiące, że przerwa się rozpoczyna.Użyj task.wait(), aby zatrzymać się na przerwę za pomocą intermissionDuration z GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Przetestuj i sprawdź, czy oświadczenie drukowane "Starting intermission" jest wyświetlane co najmniej dwa razy.Widząc wiadomość dwa razy dowodzi, że pętla powtórzenia nie znalazła wystarczającej liczby graczy i uruchomiła się ponownie.Będziesz musiał poczekać na czas przerwy, zanim zobaczysz wiadomość po raz drugi.

Wskazówki dotyczące rozwiązywania problemów

W tym momencie, jeśli nie pojawiasz się zamiarem, spróbuj jednej z poniższych opcji.

  • task.wait() powinno znajdować się wewnątrz pętli powtórzenia.Bez oczekiwania skrypt będzie uruchamiany zbyt wiele razy w sekundzie, przeciążając Roblox Studio i powodując błąd.
  • W module Ustawień gry zmienna intermissionDuration powinna być większa niż 1. Jeśli jest niższa, skrypt może powtarzać się zbyt często, powodując problemy z opóźnieniem.

Zakończ przerwę

Gdy pojawi się wystarczająca liczba graczy, poczekaj na krótki czas przejścia.Następnie wysyłaj je do meczu, wywołując funkcję prepareGame() w MatchManager.Pamiętaj, że funkcja po prostu drukuje linię, ale dodasz więcej kodu później.

  1. Na końcu pętla powtórzenia dodaj oświadczenie o drukowaniu mówiące, że przerwa się skończyła, aby przetestować swój kod.Następnie podążaj za nim za pomocą zmiennej task.wait() używającą wartości GameSetting's transitionTime.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. Po oczekiwaniu wezwij prepareGame() z modułu MatchManager.Gdy kod zostanie wykonany, wyświetli on tylko tekst w oknie wyjściowym.Poczekaj do następnej sekcji, aby przetestować ten kod.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

Testuj gry wieloosobowe

Aby kod został wykonany teraz prepareGame(), musi wyjść z pętli powtórzenia.Ale, aby to zrobić, musi istnieć więcej niż jeden gracz.Oznacza to, że jeśli użyjesz przycisku playtest, funkcja nigdy nie zostanie uruchomiona, ponieważ jesteś jedynym graczem w grze (chyba że twoja minimalna liczba graczy wynosi jeden).Aby to przetestować, musisz symulować grę wieloosobową.

Uruchom lokalny serwer

Aby przetestować kod wymagający więcej niż jednego gracza, utwórz lokalny serwer.Chociaż opublikowane gry są zwykle na serwerach Roblox, lokalny serwer symuluje grę wieloosobową na komputerze z symulowanymi graczami.

  1. Aby uruchomić lokalny serwer, w zakładce Test > Klienty i serwery > ustaw sekcję odtwarzania gracza na liczbę graczy w zmiennej minimumPlayers w GameSetting's.Ta lekcja używa 2 graczy.

  2. Kliknij Rozpocznij, aby rozpocząć serwer.

  3. Poczekaj kilka sekund, aż serwer się skonfiguruje.Wiele okien zostanie otwartych w dodatku do oryginalnego okna Studio.Możliwe, że będziesz musiał zezwolić na dostęp do Roblox Studio z ognistych ścian lub innego oprogramowania bezpieczeństwa online.

Wskazówki dotyczące rozwiązywania problemów

W tym momencie nie możesz zobaczyć serwerów testowych, spróbuj jednego z poniższych.

  • Jeśli masz jakiekolwiek problemy z rozpoczęciem serwera, sprawdź ponownie artykuł Problemy z ogniskiem i routerem.
  • Ustaw liczbę graczy do niewielkiej kwoty, takiej jak 2 lub 3.
  • Jeśli problem nie zostanie rozwiązany, spróbuj ponownego uruchomienia Studio lub ponownego uruchomienia komputera.

Test na lokalnym serwerze

Zobaczysz wiele okien, gdy serwer zostanie uruchomiony. Każde z nich reprezentuje inną część relacji serwer/klient.

  • Serwer (zielone tło) uruchamia gra.
  • Klient (niebieskie ramki) symuluje doświadczenie gracza.

Serwer z zielonym obrysem
>

Klient z niebieskimi bramkami
>

Gdy serwer jest włączony, możesz sprawdzić, czy kod działa.

  1. Znajdź okno Serwer z zielonym obrysem.Sprawdź oświadczenie drukowane wezwane z skryptu MatchManager.Ponieważ istnieje pętla powtórzenia, zobaczysz te same oświadczenia drukujące się powtarzające.

  2. Gdy skończysz testować, w dowolnym oknie, zamknij serwer przy pomocy przycisku Czyszczenie.To zamyka wszystkie okna serwera i klienta i przenosi cię z powrotem do twojego normalnego okna Studio.

Wskazówki dotyczące rozwiązywania problemów

W tym momencie, jeśli nie pojawiły się zamierzone oświadczenia drukowane, spróbuj jednej z poniższych opcji.

  • Sprawdź, czy funkcje takie jak prepareGame() są w zakresie pętla while true.
  • Jeśli wydruk z MatchManager nie działa, sprawdź kilka popularnych rozwiązań problemów z kodami modułowymi, takich jak upewnienie się, że skrypt MatchManager jest wymagany w GameManager lub że prepareGame() jest dodany do tabeli modułu.

Zakończone skrypty

Poniżej są ukończone skrypty do sprawdzenia podwójnego swojej pracy.

Skrypt Menadżera gry


-- Usługi
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Skrypty modułowe
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Główny cykl gry
while true do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

Skrypt Menadżera meczów


local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager

Skrypt ustawień gry


local GameSettings = {}
-- Zmienne gry
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings