Z mapą stworzoną, nadszedł czas na zaczęcie budowania skryptów. Reszta tego kursu będzie się skupiać głównie na budowaniu wszystkich różnych elementów pętli gry.
Konfiguracja Skrypt
Bitwa będzie używać kombinacji modułowych skrypt i zwykłych skryptów. Poniżej są skrypcity i ich funkcje.
GAMEManager | Skrypt. Wykonuje funkcje z kodu źródłowego z Menu meczu używając zmiennej z ustawień gry |
MatchManager | Script modułu. Wykonuje funkcje, takie jak wysyłanie graczy na arenę lub śledzenie czasu w dopasowywać. |
UstawieniaGry | Skrypt modułu. Przechowuje używane przez inne skrypty zmienne. |
Skrypt GameSettings
Utwórz skrypt modułowy o nazwie GameSettings, aby przechowywać zmienne używane przez inne skrypty, takie jak czas trwania meczu i przerwy. Te zmienne zostaną użyte przez skrypt GameManager później.
W ServerStorage , utwórz katalog o nazwie ModuleScripts. W tym katalogu utwórz nowy skrypt modułowy nazyający się GameSettings.
Otwórz GameSettings i zmień nazwę tabeli modułu, aby pasować do nazwy skryptu.
local GameSettings = {}return GameSettingsW tabeli modułu dodaj zmienne dla następujących użyć. Zrób swoje najlepsze podejście dla każdej wartości, zawsze możesz go zmienić później podczas testowania.
- Czas przerwy - Drukuj gracze czekają przed dopasowywać.
- Czas meczu - Długość meczu w sekundach.
- Minimalna liczba graczy - najmniejsza liczba graczy wymagana do rozpoczynać.
- Czas przejścia - Czas przed i po meczu w sekundach. Zmniejsza przejście między częściami gry w pętli.
local GameSettings = {}-- Zróżnicowane gryGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
Skrypt MatchManager
Drugim skryptem połąзанym z GameManager jest MatchManager. Ten skrypt zarządza zadaniami, takimi jak uruchomienie licznika lub reset graczy po zakończeniu meczu.
W MatchManager jest funkcja nazyjąca się prepareGame() Zaczyna grę poprzez przeniesienie graczy do dopasowywać.
W ServerStorage > ModuleScripts > dodaj modułowy skrypt nazywający się MatchManager. Zmień tabelę modułu.
local MatchManager = {}return MatchManagerDodaj nową funkcję modułu nazyającą się prepareGame(). Zawiera ona drukową stwierdzenie, aby testować skrypt później.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Kodowanie pętli gry
Główny pętel w grze zostanie zapisany w skrypcie GameManager używając zmiennych właśnie utworzonych. Pamiętaj, że w grze jest trzy fazy: przerwa, konkurs i czyszczenie i resetować.
Skrypt GameManager
Ten skrypt jest zwykłym skryptem serwera, więc umieść go w ServerScriptService, a nie w katalogu modułów. Prawdziwy pętel gry będzie w pewnym czasie prawdziwy pętel.
W ServerScriptService utwórz nowy skrypt o nazwie GameManager.
Dodaj zmienne dla usługi "ServerStorage", gdzie są Moduły Skryptów. Następnie dodaj zmienne dla usługi "Players", która będzie wymagana do sprawdzenia liczby graczy podczas przerw.
-- Usługilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Aby użyć wcześniej stworzonych modułów:
- Ustaw zmienne nazyjące się moduleScripts w lokalizacji katalogu ModuleScripts.
- Dodaj zmienne nazyjące się matchManager i gameSettings. Ustaw każdą zmienną, aby wymagała odpowiedniego skryptu.
-- Usługilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skripty modułulocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))Po zmienne, dodaj pętlię while true do. Wszystkie fazy pętli gry będą idły do wewnątrz, aby powtarzać nieskończono.
-- Skripty modułulocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Główny pętel w grzewhile true doend
Kodowanie przerwy
Gdy pętla gry biegnie nieokreślony czas, przerwa powinna wstrzymać pętlę i kontynuować tylko wtedy, gdy jest wystarczająco dużo graczy do dopasowywać. Aby skodować tę przerwę, włącz pętło powtarzania w pętli i tylko kontynuuj, gdy będzie wystarczająco dużo graczy, aby wyjść i przenieść graczy do dopasowywać.
Z użyciem powtarzającego się pętla , kod w pętli będzie się wykonuje przynajmniej raz. Nie jak pętla czasu, nie sprawdza warunku, dopóki pętla się nie zakończy. To gwarantuje, że gracze zawsze idą do lobby przed dopasowywać.
W pętli while true do wpisuj repeat i naciśnij Enter, aby automatycznie uzupełnić słowo kluczowe 1>do1>.
while true dorepeatuntilendSprawdź, czy obecna liczba graczy (#Players:GetPlayers()) jest większa lub równa wartości minimumPlayers zmiennej stworzonej w module UstawieniaGry.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendW pętli powtarzalnej dodaj oświadczenie drukowania mówiące, że przerwa się zaczyna. Użyj task.wait() , aby wstrzymać przerwę używając intermissionDuration z GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendZagrajtestuj i sprawdź, że drukowanie oświadczenia "Starting intermission" jest wyświetlane co najmniej dwa razy. Widząc wiadomość dwa razy potwierdza, że pętla powtarzania nie znajduje wystarczającej liczby graczy i zaczął ponownie. Będziesz musiał czekać na długość przerwy, zanim zobaczysz wiadomość po raz drugi.
Wskazówki dotyczące rozwiązywania problemów
W tym momencie, jeśli nie spawiasz się, jak chciałbyś, spróbuj jednej z poniższych opcji.
- task.wait() powinien być w środku pętli powtarzania. Bez czekania, skrypt będzie wykonuje zbyt wiele razy w ciągu sekundy, co powoduje przeciążenie Roblox Studio i powoduje błąd.
- W module Ustawienia w grze zmienne intermissionDuration powinno być większe niż 1. Jeśli jest mniejsze, skrypt może się powtarzać zbyt często, powodując problemy z opóźnieniem.
Zakończenie przerwy
Gdy wystarczy liczba wystarczająca graczy, pozwól im poczekać na krótką czas do przejścia. Następnie wysyłaj ich do meczu poprzez wezwanie funkcji prepareGame() w Menu meczu. Pamiętaj, że funkcja ta tylko drukuje linię, ale będziesz dodać więcej kodu później.
Na końcu powtarzającego się pętla dodaj oświadczenie drukowania mówiące, że przerwa się zakończyła, aby przetestować swój kod. Następnie podążaj za nim za pomocą zmiennej task.wait() używającej zmiennej transitionTime GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endPo czekach, wezwij prepareGame() z modułu MatchManager. Gdy kod zostanie wykonany, to tylko tekst zostanie wydrukowany do okienka wyjścia. Poczekaj do następnego sekcji, aby przetestować ten kod.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Testowanie gier wieloosobowych
Obecnie, aby mieć kod zbiegać się prepareGame() , musi wyjść z pętli powtarzania. Ale, aby to zrobić, musi być więcej niż jeden gracz. Oznacza to, że jeśli użyjesz przycisku playtest, funkcja nigdy nie zostanie wykonana, ponieważ jesteś jedynym graczem w grze (chyba że twoi minimalni gracze są jeden). Aby to
Początkujący lokalny serwer
Aby testować kod wymagający więcej niż jednego gracza, stwórz lokalny serwer. Meskie gry są zwykle na serwerach Roblox, ale lokalny serwer simuluje grę wieloosobową na Twoim komputerze z graczami simulowanymi.
Aby uruchomić lokalny serwer, w zakładce Test > Klienci i serwery > ustaw Dropdown gracza na liczbę graczy w zmiennej grze minimumPlayers. Ta lekcja używa 2 graczy.
Kliknij Start, aby uruchomić serwer.
Poczekaj kilka sekund, aby serwer się ustawił. Wiele okien zostanie otwartych oprócz Twojego pierwotnego okna Studio. Możliwe, że będziesz musiał pozwolić na dostęp do Roblox Studio z firewalls lub innego oprogramowania antywirusowego.
Wskazówki dotyczące rozwiązywania problemów
W tym momencie nie możesz zobaczyć serwerów testowych, spróbuj jednej z poniższych opcji.
- Jeśli masz jakiekolwiek problemy z uruchomieniem serwera, sprawdź ponownie artykuł Kwestie firewall i routera.
- Ustaw liczbę graczy na niewielką ilość, jak 2 lub 3.
- Jeśli problem nie zostanie rozwiązany, spróbuj ponownie uruchomić Studio lub ponownie uruchomić komputer.
Testowanie na lokalnym serwerze
Zobaczysz wiele okien, gdy serwer się uruchomi. Każde z nich reprezentuje inną część relacji serwera/klienta.
- Serwer (zielony pasek) zarabia gra.
- Klient (niebieskie granice) simuluje doświadczenie gracza.
Gdy serwer jest aktywny, możesz sprawdzić, czy kod działał.
Znajdź Okno Serwera z zielonym panelem. Sprawdź drukowanie zgłoszenia z pasku MatchManager. Ponieważ jest powtarzające się panele, zobaczysz tę samą drukowanie zgłoszeń.
Po zakończeniu testu, w dowolnym oknie, zamknij serwer przyciskiem Uruchom czyszczenie . To zamyka wszystkie okna serwera i klienta i przenosi cię do normalnego okna Studio.
Wskazówki dotyczące rozwiązywania problemów
W tym momencie, jeśli nie pojawiły się zamiarowane deklaracje drukowania, spróbuj jednej z poniższych opcji.
- Sprawdź, czy funkcje takie jak prepareGame() są w zakresie prawdziwego pętla while.
- Jeśli druk z MatchManager nie działał, sprawdź kilka rozwiązań problemów z modułami, takich jak upewnienie się, że skrypt MatchManager jest wymagany w GameManager lub że prepareGame() jest dodany do tabeli modułu.
Ukończone Skrypcity
Poniżej znajdują się zakończone skrypty, aby podwoić sprawdzenie swojej pracy.
Skrypt GameManager
-- Usługilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skripty modułulocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Główny pętel w grzewhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Skrypt MatchManager
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
Skrypt GameSettings
local GameSettings = {}-- Zróżnicowane gryGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings