Codierung des Spiel循ops

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Mit der erstellten Karte ist es an der Zeit, mit dem Bauen der Skripte zu beginnen. Der Rest dieses Kurses wird sich hauptsächlich auf das Skripten aller verschiedenen Elemente des Spielzyklus konzentrieren.

Die Skripte einrichten

Das Battle Royale verwendet eine Kombination von Modul-Skripts und normalen Skripts. Hier sind die Skripte und ihre Funktionen.

SpielManagerScript. Runs Funktionen vom Match Manager mit Variablen aus den Spiel Einstellungen
MatchManagerModul-Script. Führt Funktionen aus, wie das Senden von Spielern in eine Arena oder das Verfolgen der Zeit in einem übereinstimmen.
SpieleinstellungenModule-Script. Speichert übliche Variablen, die von anderen Skripts verwendet werden.

Spieleinstellungen-Skrip

Erstellen Sie ein Modul-Skript namens GameSettings , um Variablen, die von anderen Skripts verwendet werden, wie Match und Intermission Dauer, zu speichern. Diese Variablen werden später vom GameManager-Skript verwendet.

  1. In ServerStorage erstellen Sie einen Ordner namens ModuleScripts. In diesem Ordner erstellen Sie ein neues Modul-Skript namens GameSettings.

  2. Öffnen Sie GameSettings und benennen Sie die Modul-Tabelle, um den Namen des Skript, das. PL: die Skriptszu entsprechen.


    local GameSettings = {}
    return GameSettings
  3. In der Modul-Tabelle fügen Sie Variablen für die folgenden Anwendungen hinzu. Nehmen Sie Ihren besten Schätz für jeden Wert, Sie können ihn jederzeit ändern, wenn Sie testen.

    • Dauer der Pause - Sekunden warten Spieler vor einem übereinstimmen.
    • Spieldauer - Länge eines Spiels in Sekunden.
    • Minimum-Spieler - Kleine Anzahl von Spielern, die zum startenbenötigt werden.
    • Übergangszeit - Zeit vor und nach einem Match in Sekunden. Macht den Übergang zwischen den Teilen des Spiels weniger plötzlich.

    local GameSettings = {}
    -- Spiel variablen
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

MatchManager-Skript

Das zweite Skript, das mit GameManager verbunden ist, ist MatchManager. Dieses Skript verwaltet Aufgaben wie das Starten des Timers oder das Wiedersetzen von Spielern, sobald das Spiel beendet ist.

In MatchManager ist eine Funktion namens prepareGame() startet das Spiel, indem die Spieler in das übereinstimmenübergehen.

  1. In ServerStorage > ModuleScripts > fügen Sie ein Modul-Skript namens MatchManager hinzu. Neuen Sie den Modul-Tab.


    local MatchManager = {}
    return MatchManager
  2. Fügen Sie eine neue Modulfunktion hinzu, die prepareGame() heißt. Inklusive eines druckenden Statements, um das Skript später zu testen.


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

Codierung des Spiel循ops

Der Hauptspiel-Loop wird im GameManager-Skript mit den Variablen, die gerade erstellt wurden, kodiert. Denken Sie daran, es gibt drei Phasen im Spiel-Loop: Pause, Wettbewerb und Reinigung und zurücksetzen.

GameManager-Skript

Dies ist ein normales Skript, das. PL: die Skripts, also stellen Sie es in ServerScriptService ein, nicht in die Modul-Skripts-Ordner. Die tatsächliche Spiel-Loop wird in einer Weile wahrer Do-Loop sein.

  1. In ServerScriptService erstellen Sie ein neues Skript namens GameManager.

  2. Füge eine Variable für den Dienst "ServerStorage" hinzu, in dem die Modul-Skripte sind. Dann füge eine Variable für den Dienst "Players" hinzu, die für die Überprüfung der Anzahl der Spieler während der Pausen erforderlich sein wird.


    -- Dienste
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Um die zuvor erstellten Module zu verwenden:

    • Setzen Sie eine Variable namens moduleScripts in den Speicherort der ModuleScripts-Ordner.
    • Fügen Sie Variablen mit dem Namen matchManager und gameSettings hinzu. Setzen Sie jede Variable so ein, dass ihr Skript, das. PL: die Skriptserforderlich ist.

    -- Dienste
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Modul-Scripts
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
  4. Nach den Variablen fügen Sie einen while true do Loop hinzu. Alle Phasen des Spiel循ops gehen inнут, um indefinitely wiederholt zu werden.


    -- Modul-Scripts
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Hauptspiel-Loop
    while true do
    end

Codierung der Pause

Während der Spiel-Loop unbestimmt läuft, sollte die Pause die Loop stoppen und nur fortfahren, wenn genug Spieler für ein übereinstimmenvorhanden sind. Um diesen Pause zu kodieren, fügen Sie einen verschachtelten wiederholten Loop für die Pause in den Haupt-Loop ein. Dieser verschachtelte Loop wird wiederholt, bis genug Spieler vorhanden sind, um das Haupt-Loop auszuführen. Sobald genug Spieler vorhanden sind, wird es ausgeführt und das Spieler in ein übereinstimmenübergeht.

Mit einem peat-Loop , der Code in dem Loop ausgeführt wird, wird der Code mindestens einmal ausgeführt. Im Gegensatz zu einem while-Loop überprüft es nicht seine Bedingung, bis der Loop beendet ist. Dies gewährleistet, dass Spieler immer zur Lobby gehen, bevor ein übereinstimmenbeginnt.

  1. In der while true do Loop, tippe repeat und drücke Enter, um mit dem Schlüsselwort 1> until1> automatisch abzuschließen.


    while true do
    repeat
    until
    end
  2. Überprüfen Sie, ob die aktuelle Anzahl von Spielern (#Players:GetPlayers()) größer oder gleich ist der minimumPlayers Variable, die vor dem SpielSettings-Modul erstellt wurde.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. In der Wiederholungs-Schleife fügen Sie eine druckende Anweisung hinzu, die sagt, dass die Pause beginnt. Verwenden Sie task.wait() , um für die Pause zu pausieren, verwendendo intermissionDuration aus GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Spielen Sie den Test und überprüfen Sie, dass die Druckanzeige "Starting intermission" mindestens zweimal angezeigt wird. Wenn Sie das Nachrichten-Message zweimal sehen, beweist die Wiederholungslife, dass der Repeat-Loop nicht genug Spieler gefunden hat und erneut ausgeführt wurde. Sie müssen die Länge der Pause warten, bevor Sie das Nachrichten-Message erneut sehen.

Troubleshooting-Tipps

An diesem Punkt, wenn Sie nicht wie beabsichtigt zu spawnen, versuchen Sie einen der folgenden unten.

  • task.wait() sollte sich im wiederholungs循环 befinden. Ohne den Warteschlangen wird das Skript zu oft in einer Sekunde ausgeführt, überlastet Roblox Studio und verursacht einen Fehler.
  • Im Modul "Spieleinstellungen" sollte die Variable intermissionDuration größer als 1 sein. Wenn sie zu niedrig ist, kann das Skript zu oft wiederholt werden, was langsame Probleme verursacht.

Pause beenden

Sobald genug Spieler sind, haben Sie sie eine kurze Übergangszeit warten. Dann senden Sie sie in das Spiel, indem Sie die prepareGame() Funktion im MatchManager aufrufen. Denken Sie daran, dass Funktion nur eine Zeile druckt, aber Sie fügen später mehr Code hinzu.

  1. Am Ende des wiederholten Loops fügen Sie eine druckende Anweisung hinzu, die sagt, dass die Pause vorbei ist, um Ihren Codeszu testen. Dann folgen Sie ihm mit einer task.wait() , die die transitionTime Variable von GameSettings verwendet.


    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. Nach dem Warten rufen Sie den prepareGame() aus dem MatchManager-Modul. Wenn der Code ausgeführt wird, wird dies einfach Text in das Ausgabefenster drucken. Warten Sie, bis der nächste Abschnitt, um diesen Codeszu testen.


    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

Multiplayer-Spiele testen

Im Moment muss der Code prepareGame() ausgeführt werden, um ihn zu wiederholen. Aber, um das zu tun, muss es mehr als einen Spieler:ingeben. Dies bedeutet, wenn Sie die Spieltest-Funktion verwenden, dass die Funktion niemals ausgeführt wird, weil Sie der einzige Spieler im Spiel sind (außer Ihren minimalen Spielern). Um dies zu testen, müssen Sie ein mehrspieliges Spiel simulieren.

Beginnen eines lokalen Servers

Um Code, der mehr als einen Spieler:inerfordert, auf mehreren Spielen zu testen, erstellen Sie einen lokalen Server. Während veröffentlichte Spiele normalerweise auf Roblox-Servern sind, simuliert ein lokaler Server ein mehrspieliges Spiel auf Ihrem Computer mit simulierten Spielern.

  1. Um einen lokalen Server zu starten, in der Test- -Registerkarte > Clients and Servers -Sektion > setzen Sie das Spieler-Dropdown auf die Anzahl der Spieler in GameSettings's Variable minimumPlayers. Diese Lektion verwendet 2 Spieler.

  2. Klicken Sie auf Starten, um den Server zu beginnen.

  3. Warte einige Sekunden, bis der Server eingerichtet ist. Mehrere Fenster werden in deinem ursprünglichen Studio-Fenster geöffnet. Du musst möglicherweise Zugriff auf Roblox Studio von Firewalls oder anderen Online-Sicherheits-Softwareen erlauben.

Troubleshooting-Tipps

An diesem Punkt können Sie die Testserver nicht sehen, versuchen Sie einen der folgenden.

  • Wenn Sie irgendwelche Probleme mit dem Serverstart haben, überprüfen Sie doppelt den Artikel Firewall and Router Issues.
  • Setzen Sie die Anzahl der Spieler auf eine kleine Anzahl, wie 2 oder 3.
  • Wenn das Problem nicht gelöst wird, versuchen Sie, Studio neu zu starten oder Ihren Computer neu zu starten.

Testen im lokalen Server

Sie sehen mehrere Fenster, wenn der Server startet. Jedes davon repräsentiert einen anderen Teil der Server/Client-Beziehung.

  • Server (grüne Grenze) läuft das Spiel.
  • Client (blaue Kanten) simuliert die Erlebniseines Spieler:in.
Server mit grüner Grenze
Client mit blauer Kante

Mit dem Server up, können Sie überprüfen, ob der Code funktioniert hat.

  1. Finden Sie das Server-Fenster mit der grünen Kante. Überprüfen Sie die druckenden Anweisungen, die vom Skript, das. PL: die Skriptsausgerufen werden. Da es einen wiederholten Loop gibt, werden Sie die gleichen druckenden Anweisungen sehen.

  2. Sobald Sie das Testen abgeschlossen haben, in jedem Fenster, schließen Sie den Server mit dem Cleanup-Button. Dies schließt alle Server- und Client-Fenster und führt Sie zurück zu Ihrem normalen Studio-Fenster.

Troubleshooting-Tipps

Wenn die beabsichtigten Anzeigestatistiken nicht angezeigt wurden, versuchen Sie es mit einer der folgenden Optionen.

  • Überprüfen Sie, dass Funktionen wie prepareGame() in der while true do loop sind.
  • Wenn die Ausgabe von MatchManager nicht funktionierte, überprüfen Sie einige häufige Fehler mit Modul-Skripts, wie z. B. sicherzustellen, dass das MatchManager-Skript in GameManager erforderlich ist, oder dass prepareGame() an die Tabelle dieses Moduls angehängt wird.

Abgeschlossene Skripte

Dies sind abgeschlossene Skripte, um deine Arbeit zu überprüfen.

GameManager-Skript


-- Dienste
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Modul-Scripts
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Hauptspiel-Loop
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

MatchManager-Skript


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

Spieleinstellungen-Skrip


local GameSettings = {}
-- Spiel variablen
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings